home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / shells / cshel40a / part01 next >
Encoding:
Internet Message Format  |  1991-02-07  |  71.2 KB

  1. Path: news.larc.nasa.gov!amiga-request
  2. From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v91i003: CShell 4.02A - alternative command interface, Part01/03
  4. Reply-To: Cesare.Dieni@p1.f602.n332.z2.fidonet.org (Cesare Dieni)
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v91i003@ab20.larc.nasa.gov>
  7. Date: 07 Feb 91 00:54:28 GMT
  8. Approved: tadguy@uunet.UU.NET (Tad Guy)
  9. X-Mail-Submissions-To: amiga@uunet.uu.net
  10. X-Post-Discussions-To: comp.sys.amiga.misc
  11.  
  12. Submitted-by: Cesare.Dieni@p1.f602.n332.z2.fidonet.org (Cesare Dieni)
  13. Posting-number: Volume 91, Issue 003
  14. Archive-name: shells/cshell-4.02a/part01
  15.  
  16. Shell provides a convient AmigaDos alternative command interface.
  17. All its commands are internal and thus does not rely on the c:
  18. commands for any functionality.
  19.  
  20. Major features include:
  21.  
  22.     -command line editing
  23.     -shell & Amigados search path support
  24.     -simple history
  25.     -redirection of any command
  26.     -piping
  27.     -aliases
  28.     -variables & variable handling (embedded variables)
  29.     -file name expansion via conventional wild carding ('?', '*' and more)
  30.     -conditionals (if/else ect..)
  31.     -source files  (w/ gotos and labels)
  32.     -many built in commands to speed things up
  33.  
  34. New to 4.02A:
  35. - Fixed bug that caused loss of memory on exit.
  36. - cp now copies protection bits; use -f switch if you want to avoid this.
  37. - Added  commands: man (and alias manlist), uniq, head, tail, tee.
  38. - This doc has been reformatted to work with man.
  39.  
  40. For any problems contact me at:
  41.  
  42.  FIDONET: 2:332/602.1@fidonet.org 
  43.  UUCP:    root@wolf.sublink.org 
  44.  ARPA:    Cesare_Dieni@p1.f602.n332.z2.fidonet.sublink.org 
  45.  BITNET:  PERUGIA@ICNUCEVM.CNUCE.CNR.IT 
  46.  
  47. Thanx in advance,
  48.  
  49. -Cesare Dieni 
  50.  
  51. #!/bin/sh
  52. # This is a shell archive.  Remove anything before this line, then unpack
  53. # it by saving it into a file and typing "sh file".  To overwrite existing
  54. # files, type "sh file -c".  You can also feed this as standard input via
  55. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  56. # will see the following message at the end:
  57. #        "End of archive 1 (of 3)."
  58. # Contents:  src src/comm2.c src/globals.c src/main.c src/makefile
  59. #   src/rawconsole.c src/run.c src/set.c src/shell.h
  60. #   src/shellfunctions.h src/sub.c
  61. # Wrapped by tadguy@ab20 on Wed Feb  6 19:54:18 1991
  62. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  63. if test ! -d 'src' ; then
  64.     echo shar: Creating directory \"'src'\"
  65.     mkdir 'src'
  66. fi
  67. if test -f 'src/comm2.c' -a "${1}" != "-c" ; then 
  68.   echo shar: Will not clobber existing file \"'src/comm2.c'\"
  69. else
  70. echo shar: Extracting \"'src/comm2.c'\" \(13217 characters\)
  71. sed "s/^X//" >'src/comm2.c' <<'END_OF_FILE'
  72. X/*
  73. X * COMM2.C
  74. X *
  75. X * (c)1986 Matthew Dillon     9 October 1986
  76. X *
  77. X * Version 2.07M by Steve Drew 10-Sep-87
  78. X *
  79. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  80. X *
  81. X */
  82. X
  83. X/* Casting conveniences */
  84. X#define BPTR_TO_C(strtag, var)  ((struct strtag *)(BADDR( (ULONG) var)))
  85. X#define PROC(task)              ((struct Process *)task)
  86. X#define CLI(proc)               (BPTR_TO_C(CommandLineInterface, proc->pr_CLI))
  87. X
  88. X/* Externs */
  89. Xextern int has_wild;                    /* flag set if any arg has a ? or * */
  90. X
  91. X/* globals */
  92. Xint cp_update, cp_date, cp_flags;
  93. X
  94. Xdo_abortline()
  95. X{
  96. XExec_abortline = 1;
  97. Xreturn 0;
  98. X}
  99. X
  100. Xdo_return()
  101. X{
  102. Xregister int retcode=(ac<2 ? 0 : atoi(av[1]));
  103. X   Exec_abortline = 1;
  104. X   if (Src_stack) {
  105. X       FILE *ptr = (FILE *)Src_base[Src_stack - 1];
  106. X       ptr->_bp = ptr->_bend;
  107. X       ptr->_flags |= _EOF;
  108. X/*     fseek (Src_base[Src_stack - 1], 0L, 2); */
  109. X      return retcode;
  110. X   } else main_exit(retcode);
  111. X}
  112. X
  113. X/*
  114. X * STRHEAD
  115. X *
  116. X * place a string into a variable removing everything after and including
  117. X * the 'break' character
  118. X *
  119. X * strhead varname breakchar string
  120. X *
  121. X */
  122. X
  123. Xdo_strhead()
  124. X{
  125. Xchar *s;
  126. Xif (s=index(av[3],*av[2])) *s='\0';
  127. Xset_var (LEVEL_SET, av[1], av[3]);
  128. Xreturn 0;
  129. X}
  130. X
  131. Xdo_strtail()
  132. X{
  133. Xchar *s;
  134. Xif (s=index(av[3],*av[2])) s++; else s=av[3];
  135. Xset_var (LEVEL_SET, av[1], s);
  136. Xreturn 0;
  137. X}
  138. X
  139. Xlong dptrtosecs(d)
  140. Xstruct DPTR *d;
  141. X{
  142. Xregister struct DateStamp *ds=(&d->fib->fib_Date);
  143. Xreturn ds->ds_Days*86400 + ds->ds_Minute*60 + ds->ds_Tick/TICKS_PER_SECOND;
  144. X}
  145. X
  146. Xlong timeof(s)
  147. Xchar *s;
  148. X{
  149. Xstruct DPTR *d;
  150. Xint dummy;
  151. Xlong n;
  152. X
  153. Xif ( (d=dopen(s,&dummy))==NULL ) return 0L;
  154. Xn=dptrtosecs(d);
  155. Xdclose(d);
  156. Xreturn n;
  157. X}
  158. X
  159. X/*
  160. X * if -f file (exists) or:
  161. X *
  162. X * if A < B   <, >, =, <=, >=, <>, where A and B are either:
  163. X * nothing
  164. X * a string
  165. X * a value (begins w/ number)
  166. X */
  167. X
  168. Xdo_if(garbage, com)
  169. Xchar *garbage;
  170. X{
  171. Xint result;
  172. Xint i;
  173. X
  174. Xswitch (com) {
  175. X    case 0:
  176. X    if (If_stack && If_base[If_stack - 1]) If_base[If_stack++] = 1;
  177. X    else {
  178. X        get_opt("rftmdvn",&i);
  179. X        result=evalif(i);
  180. X        If_base[If_stack++]=(options & 64 ? result : !result);
  181. X        }
  182. X    break;
  183. X    case 1:
  184. X    if (If_stack > 1 && If_base[If_stack - 2]) break;
  185. X    if (If_stack) If_base[If_stack - 1] ^= 1;
  186. X    break;
  187. X    case 2:
  188. X    if (If_stack) --If_stack;
  189. X    break;
  190. X     }
  191. Xdisable = (If_stack) ? If_base[If_stack - 1] : 0;
  192. Xif (If_stack >= MAXIF) {
  193. X    fprintf(stderr,"If's too deep\n");
  194. X    disable = If_stack = 0;
  195. X    return -1;
  196. X    }
  197. Xif (forward_goto) disable = If_base[If_stack - 1] = 0;
  198. Xreturn 0;
  199. X}
  200. X
  201. Xevalif(i)
  202. Xregister unsigned int i;
  203. X{
  204. Xchar c;
  205. Xlong num, t0, isint;
  206. Xlong AvailMem();
  207. X
  208. Xswitch(options & ~64) {
  209. X    case 0:
  210. X    if (ac-i != 3) return (ac>i && *av[i]);
  211. X    num  = Atol(av[i]);
  212. X    isint  = ! IoErr();
  213. X    num -= Atol(av[i+2]);
  214. X    isint &= ! IoErr();
  215. X    if (!isint) num=strcmp(av[i],av[i+2]);
  216. X    if (num < 0)       c='<';
  217. X    else if (num > 0)  c='>';
  218. X    else if (num == 0) c='=';
  219. X    return index(av[i+1], c) != NULL;
  220. X    case 1:
  221. X    return do_rpn(NULL,i);
  222. X    case 2:
  223. X    return exists(av[i]);
  224. X    case 4:
  225. X    t0=timeof(av[i++]);
  226. X    for ( ; i<ac ; i++)
  227. X        if (t0<=timeof(av[i])) return 1;
  228. X    return 0;
  229. X    case 8:
  230. X    return (AvailMem( (long)MEMF_FAST )!=0);
  231. X    case 16:
  232. X    return (isdir(av[i])!=0);
  233. X    case 32:
  234. X    return (get_var(LEVEL_SET,av[i]) != 0);
  235. X    default:
  236. X    ierror(NULL,500);
  237. X    return 0;
  238. X    }
  239. X}
  240. X
  241. Xdo_label()
  242. X{
  243. X   char aseek[32];
  244. X
  245. X   if (Src_stack == 0) {
  246. X      ierror (NULL, 502);
  247. X      return (-1);
  248. X   }
  249. X
  250. X   sprintf (aseek, "%ld %d", Src_pos[Src_stack-1], If_stack);
  251. X   set_var (LEVEL_LABEL + Src_stack - 1, av[1], aseek);
  252. X   if (!strcmp(av[1],get_var(LEVEL_SET,v_gotofwd)))
  253. X      forward_goto = 0;
  254. X   return 0;
  255. X}
  256. X
  257. Xdo_goto()
  258. X{
  259. X   int new;
  260. X   long pos;
  261. X   char *lab;
  262. X
  263. X   if (Src_stack == 0) {
  264. X      ierror (NULL, 502);
  265. X   } else {
  266. X      lab = get_var (LEVEL_LABEL + Src_stack - 1, av[1]);
  267. X      if (lab == NULL) {
  268. X         forward_goto = 1;
  269. X         set_var (LEVEL_SET, v_gotofwd, av[1]);
  270. X         return(0);
  271. X      } else {
  272. X         pos = atoi(lab);
  273. X         fseek (Src_base[Src_stack - 1], pos, 0);
  274. X         Src_pos[Src_stack - 1] = pos;
  275. X         new = atoi(next_word(lab));
  276. X         for (; If_stack < new; ++If_stack)
  277. X            If_base[If_stack] = 0;
  278. X         If_stack = new;
  279. X      }
  280. X   }
  281. X   Exec_abortline = 1;
  282. X   return (0);      /* Don't execute rest of this line */
  283. X}
  284. X
  285. X
  286. Xdo_inc(garbage, com)
  287. Xchar *garbage;
  288. X{
  289. Xchar *var, num[32];
  290. X
  291. Xif (ac>2) com *= atoi(av[2]);
  292. Xif (var = get_var (LEVEL_SET, av[1])) {
  293. X    sprintf (num, "%d", atoi(var)+com);
  294. X    set_var (LEVEL_SET, av[1], num);
  295. X    }
  296. Xreturn 0;
  297. X}
  298. X
  299. Xdo_input()
  300. X{
  301. Xchar in[256], *p,*s;
  302. Xunsigned int i;
  303. X
  304. Xfor (i=1; i < ac; ++i)
  305. X    if (gets(in)) {
  306. X    for(p = in; *p; p = s) {
  307. X        s = next_word(p);
  308. X        if (*s) *(s-1) = 0xA0;
  309. X        }
  310. X    set_var (LEVEL_SET, av[i], in);
  311. X    }
  312. Xreturn 0;
  313. X}
  314. X
  315. Xdo_ver()
  316. X{
  317. Xextern char shellname[];
  318. X
  319. Xputs(shellname);
  320. Xputs("(c)1986 Matthew Dillon\n\
  321. XManx (M) versions by Steve Drew\n\
  322. XARP (A) versions by Carlo Borreo & Cesare Dieni\n");
  323. Xreturn 0;
  324. X}
  325. X
  326. Xdo_ps()
  327. X{
  328. X/* this code fragment based on ps.c command by Dewi Williams */
  329. X
  330. Xregister int    count;        /* loop variable        */
  331. Xstruct Task    *task;        /* EXEC descriptor        */
  332. Xchar        strbuf[64+1];    /* scratch for btocstr()    */
  333. Xchar        cmd[40+1];    /* holds cmd name        */
  334. Xlong ncli;
  335. X
  336. Xprintf("Proc Command Name         CLI Type    Pri.  Address  Directory\n");
  337. XForbid();
  338. X
  339. Xncli=(long)FindCLI(0L);
  340. Xfor (count = 1; count <= ncli ; count++)
  341. X        /* or just assume 20?*/
  342. X    if (task = (struct Task *)FindCLI((long)count)) {
  343. X    if (task==NULL) continue;
  344. X    /* Sanity check just in case */
  345. X    if (PROC(task)->pr_TaskNum == 0 || PROC(task)->pr_CLI == 0) continue;
  346. X                            /* or complain? */
  347. X    BtoCStr(cmd,   CLI(PROC(task))->cli_CommandName, 40L);
  348. X    BtoCStr(strbuf,CLI(PROC(task))->cli_SetName    , 64L);
  349. X    printf("%2d   %-20.20s %-11.11s %3d  %8lx  %s\n",
  350. X        count,
  351. X        cmd,
  352. X        task->tc_Node.ln_Name,
  353. X        task->tc_Node.ln_Pri,
  354. X        task,
  355. X        strbuf);
  356. X    }
  357. XPermit();
  358. Xreturn 0;
  359. X}
  360. X
  361. X/*
  362. X * CP [-d] [-u] file file
  363. X * CP [-d] [-u] file file file... destdir
  364. X * CP [-r][-u][-d] dir dir dir... destdir
  365. X */
  366. X
  367. Xchar *errstr;          /* let's be alittle more informative */
  368. X
  369. Xdo_copy()
  370. X{
  371. Xregister int recur, ierr;
  372. Xregister char *destname;
  373. Xregister char destisdir;
  374. Xregister FIB *fib;
  375. Xint i;
  376. X
  377. Xerrstr = "";
  378. Xierr = 0;
  379. X
  380. Xfib = (FIB *)AllocMem((long)sizeof(FIB), MEMF_PUBLIC);
  381. X
  382. Xget_opt("rudf",&i);
  383. Xrecur     = (options & 0x01);
  384. Xcp_update = (options & 0x02);
  385. Xcp_date   = (!(options & 0x04)); /* the default is keep orignal file date */
  386. Xcp_flags  = (!(options & 0x08)); /* and flags */
  387. X
  388. Xdestname = av[ac - 1];
  389. X
  390. Xif (ac < i + 2) {
  391. X    ierr = 500;
  392. X    goto done;
  393. X    }
  394. Xdestisdir = isdir(destname);
  395. Xif (ac > i + 2 && !destisdir) {
  396. X    ierr = 507;
  397. X    goto done;
  398. X    }
  399. X
  400. X/*
  401. X * copy set:                        reduce to:
  402. X *    file to file                     file to file
  403. X *    dir  to file (NOT ALLOWED)
  404. X *    file to dir                      dir to dir
  405. X *    dir  to dir                      dir to dir
  406. X *
  407. X */
  408. X
  409. Xfor (; i<ac-1 && !dobreak(); ++i) {
  410. X    short srcisdir = isdir(av[i]);
  411. X    if (srcisdir && has_wild && (ac >2)) /* hack to stop dir's from */
  412. X        continue;             /* getting copied if specified */
  413. X                         /* from wild expansion */
  414. X    if (srcisdir) {
  415. X        BPTR srcdir, destdir;
  416. X        if (!destisdir) {
  417. X            if (exists(destname)) {
  418. X                ierr = 507;    /* disallow dir to file */
  419. X                goto done;
  420. X                }
  421. X            if (destdir = CreateDir(destname)) UnLock(destdir);
  422. X            destisdir = 1;
  423. X            }
  424. X        if (!(destdir = Lock(destname, ACCESS_READ))) {
  425. X            ierr = 205;
  426. X            errstr = destname;
  427. X            goto done;
  428. X            }
  429. X        if (!(srcdir = Lock(av[i], ACCESS_READ))) {
  430. X            ierr = 205;
  431. X            errstr = av[i];
  432. X            UnLock(destdir);
  433. X            goto done;
  434. X            }
  435. X        ierr = copydir(srcdir, destdir, recur);
  436. X        UnLock(srcdir);
  437. X        UnLock(destdir);
  438. X        if (ierr) break;
  439. X        }
  440. X    else {        /* FILE to DIR,   FILE to FILE   */
  441. X        BPTR destdir, srcdir, tmp;
  442. X        char *destfilename;
  443. X
  444. X        srcdir = (BPTR)(Myprocess->pr_CurrentDir);
  445. X
  446. X        if ((tmp = Lock(av[i], ACCESS_READ)) == NULL || !Examine(tmp,fib)) {
  447. X            if (tmp) UnLock(tmp);
  448. X            ierr = 205;
  449. X            errstr = av[i];
  450. X            goto done;
  451. X            }
  452. X        UnLock(tmp);
  453. X        if (destisdir) {
  454. X            destdir = Lock(destname, ACCESS_READ);
  455. X            destfilename = fib->fib_FileName;
  456. X            }
  457. X        else {
  458. X            destdir = srcdir;
  459. X            destfilename = destname;
  460. X            }
  461. X        printf(" %s..",av[i]);
  462. X        fflush(stdout);
  463. X        ierr = copyfile(av[i], srcdir, destfilename, destdir);
  464. X        if (destisdir) UnLock(destdir);
  465. X        if (ierr) break;
  466. X        }
  467. X    }
  468. X
  469. Xdone:
  470. X
  471. XFreeMem(fib, (long)sizeof(FIB));
  472. Xif (ierr) {
  473. X    ierror(errstr, ierr);
  474. X    return(20);
  475. X    }
  476. Xreturn 0;
  477. X}
  478. X
  479. X
  480. Xcopydir(srcdir, destdir, recur)
  481. Xregister BPTR srcdir, destdir;
  482. X{
  483. X   BPTR cwd;
  484. X   register FIB *srcfib;
  485. X   register BPTR destlock, srclock;
  486. X   int ierr;
  487. X   static int level;
  488. X
  489. X   level++;
  490. X   ierr = 0;
  491. X   srcfib = (FIB *)AllocMem((long)sizeof(FIB), MEMF_PUBLIC);
  492. X   if (Examine(srcdir, srcfib)) {
  493. X      while (ExNext(srcdir, srcfib)) {
  494. X         if (CHECKBREAK())
  495. X            break;
  496. X         if (srcfib->fib_DirEntryType < 0) {
  497. X            printf("%*s%s..",(level-1) * 6," ",srcfib->fib_FileName);
  498. X            fflush(stdout);
  499. X            ierr = copyfile(srcfib->fib_FileName,srcdir,srcfib->fib_FileName,destdir);
  500. X            if (ierr)
  501. X               break;
  502. X         } else {
  503. X            if (recur) {
  504. X               cwd = CurrentDir(srcdir);
  505. X               if (srclock = Lock(srcfib->fib_FileName, ACCESS_READ)) {
  506. X                  CurrentDir(destdir);
  507. X                  if (!(destlock = Lock(srcfib->fib_FileName, ACCESS_WRITE))) {
  508. X                     destlock = CreateDir(srcfib->fib_FileName);
  509. X                     printf("%*s%s (Dir)....[Created]\n",(level-1) * 6,
  510. X                                " ",srcfib->fib_FileName);
  511. X
  512. X                        /* UnLock and re Lock if newly created
  513. X                           for file_date() to work properly
  514. X                        */
  515. X                     if (destlock) UnLock(destlock);
  516. X                     destlock = Lock(srcfib->fib_FileName, ACCESS_WRITE);
  517. X                  }
  518. X                  else
  519. X                     printf("%*s%s (Dir)\n",(level-1) * 6," ",srcfib->fib_FileName);
  520. X                  if (destlock) {
  521. X                     ierr = copydir(srclock, destlock, recur);
  522. X                     UnLock(destlock);
  523. X                  } else {
  524. X                     ierr = (int)((long)IoErr());
  525. X                  }
  526. X                  UnLock(srclock);
  527. X               } else {
  528. X                  ierr = (int)((long)IoErr());
  529. X               }
  530. X               CurrentDir(cwd);
  531. X               if (ierr)
  532. X                  break;
  533. X            }
  534. X         }
  535. X      }
  536. X   } else {
  537. X      ierr = (int)((long)IoErr());
  538. X   }
  539. X   --level;
  540. X   FreeMem(srcfib, (long)sizeof(FIB));
  541. X   return(ierr);
  542. X}
  543. X
  544. X
  545. Xcopyfile(srcname, srcdir, destname, destdir)
  546. Xchar *srcname, *destname;
  547. XBPTR srcdir, destdir;
  548. X{
  549. XBPTR cwd;
  550. XBPTR f1, f2;
  551. Xlong i;
  552. Xint stat,ierr;
  553. Xchar *buf;
  554. Xstruct DPTR *dp, *dps = NULL;
  555. X
  556. Xif ((buf = (char *)AllocMem(8192L, MEMF_PUBLIC|MEMF_CLEAR))==NULL)
  557. X    { ierr = 103; goto fail; }
  558. Xierr = 0;
  559. Xcwd = CurrentDir(srcdir);
  560. Xif ((f1=Open(srcname, MODE_OLDFILE))==NULL)
  561. X    { errstr = srcname; ierr = 205; goto fail; }
  562. Xdps = dopen(srcname,&stat);
  563. XCurrentDir(destdir);
  564. Xif (cp_update)
  565. X    {
  566. X    dp=dopen(destname, &stat);
  567. X    if ( dptrtosecs(dp) >= dptrtosecs(dps) &&
  568. X        !strcmp(dps->fib->fib_FileName, dp->fib->fib_FileName))
  569. X        { dclose(dp); Close(f1); printf("..not newer\n"); goto fail; }
  570. X    dclose(dp);
  571. X    }
  572. Xif ((f2=Open(destname, MODE_NEWFILE))==NULL)
  573. X    { Close(f1); ierr = (int)((long)IoErr()); errstr=destname; goto fail;  }
  574. Xwhile (i = Read(f1, buf, 8192L))
  575. X    if (Write(f2, buf, i) != i) { ierr = (int)((long)IoErr()); break; }
  576. XClose(f2);
  577. XClose(f1);
  578. Xif (!ierr)
  579. X    {
  580. X    if (cp_date) file_date(&dps->fib->fib_Date, destname);
  581. X    if (cp_flags) SetProtection(destname, dps->fib->fib_Protection);
  582. X    printf("..copied\n");
  583. X    }
  584. Xelse DeleteFile(destname);
  585. Xfail:
  586. X dclose(dps);
  587. X if (buf) FreeMem(buf, 8192L);
  588. X CurrentDir(cwd);
  589. X return(ierr);
  590. X}
  591. X
  592. Xdo_touch()
  593. X{
  594. Xstruct DateStamp ds;
  595. Xregister unsigned int i;
  596. XDateStamp(&ds);
  597. Xfor (i=1; i<ac; i++) if (file_date(&ds, av[i])) ierror(av[i],500);
  598. Xreturn 0;
  599. X}
  600. X
  601. Xfile_date(date,name)
  602. Xstruct DateStamp *date;
  603. Xchar *name;
  604. X{
  605. Xlong packargs[7];
  606. XUBYTE *ptr;
  607. Xstruct MsgPort *task;
  608. XBPTR dirlock;
  609. Xstruct DPTR *tmp;
  610. Xint stat;
  611. X
  612. Xif (!(task = (struct MsgPort *)DeviceProc(name))) return(1);
  613. Xif (tmp = dopen(name, &stat)) {
  614. X    dirlock = ParentDir(tmp->lock);
  615. X    ptr=AllocMem(65L,MEMF_PUBLIC);
  616. X    CtoBStr(tmp->fib->fib_FileName,(ULONG)ptr >> 2L,64L);
  617. X    dclose(tmp);
  618. X    packargs[1]=dirlock;
  619. X    packargs[2]=(ULONG)ptr >> 2L;
  620. X    packargs[3]=(long)date;
  621. X    SendPacket(ACTION_SET_DATE,packargs,task);
  622. X    UnLock(dirlock);
  623. X    FreeMem(ptr,65L);
  624. X    }
  625. Xreturn 0;
  626. X}
  627. X
  628. Xdo_addbuffers()
  629. X{
  630. Xlong packargs[7];
  631. Xlong n;
  632. Xstruct MsgPort *task=(struct MsgPort *)DeviceProc(av[1]);
  633. X
  634. Xif (!task) { ierror(av[1],510); return 20; }
  635. Xn=myatoi(av[2],1,32767); if (atoierr) return 20;
  636. Xpackargs[0]=n;
  637. XSendPacket(ACTION_MORE_CACHE,packargs,task);
  638. Xreturn 0;
  639. X}
  640. X
  641. Xdo_relabel()
  642. X{
  643. Xlong packargs[7];
  644. XUBYTE *ptr;
  645. Xstruct MsgPort *task=(struct MsgPort *)DeviceProc(av[1]);
  646. X
  647. Xif (!task) { ierror(av[1],510); return 20; }
  648. Xptr=AllocMem(65L,MEMF_PUBLIC);
  649. XCtoBStr(av[2],(ULONG)ptr >> 2L,64L);
  650. Xpackargs[0]=(ULONG)ptr >> 2L;
  651. XSendPacket(ACTION_RENAME_DISK,packargs,task);
  652. XFreeMem(ptr,65L);
  653. Xchangedisk(task);
  654. Xreturn 0;
  655. X}
  656. X
  657. Xdo_diskchange()
  658. X{
  659. Xstruct MsgPort *task=(struct MsgPort *)DeviceProc(av[1]);
  660. X
  661. Xif (!task) { ierror(av[1],510); return 20; }
  662. Xchangedisk(task);
  663. Xreturn 0;
  664. X}
  665. X
  666. Xchangedisk(task)
  667. Xstruct MsgPort *task;
  668. X{
  669. Xlong packargs[7];
  670. X
  671. Xpackargs[0]=1L;
  672. XSendPacket(ACTION_INHIBIT,packargs,task);
  673. Xpackargs[0]=0L;
  674. XSendPacket(ACTION_INHIBIT,packargs,task);
  675. X}
  676. END_OF_FILE
  677. if test 13217 -ne `wc -c <'src/comm2.c'`; then
  678.     echo shar: \"'src/comm2.c'\" unpacked with wrong size!
  679. fi
  680. # end of 'src/comm2.c'
  681. fi
  682. if test -f 'src/globals.c' -a "${1}" != "-c" ; then 
  683.   echo shar: Will not clobber existing file \"'src/globals.c'\"
  684. else
  685. echo shar: Extracting \"'src/globals.c'\" \(3551 characters\)
  686. sed "s/^X//" >'src/globals.c' <<'END_OF_FILE'
  687. X
  688. X/*
  689. X * GLOBALS.C
  690. X *
  691. X * (c)1986 Matthew Dillon     9 October 1986
  692. X *
  693. X * Version 2.07M by Steve Drew 10-Sep-87
  694. X *
  695. X *    Most global variables.
  696. X *
  697. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  698. X *
  699. X */
  700. X
  701. Xchar v_titlebar    []="_titlebar";    /* Window title                */
  702. Xchar v_prompt    []="_prompt";    /* your prompt (ascii command)        */
  703. Xchar v_hist    []="_history";    /* set history depth (value)        */
  704. Xchar v_histnum    []="_histnum";    /* set history numbering var        */
  705. Xchar v_debug    []="_debug";    /* set debug mode            */
  706. Xchar v_verbose    []="_verbose";    /* set verbose for source files        */
  707. Xchar v_stat    []="_maxerr";    /* worst return value to date        */
  708. Xchar v_lasterr    []="_lasterr";    /* return value from last comm.        */
  709. Xchar v_cwd    []="_cwd";    /* current directory            */
  710. Xchar v_except    []="_except";    /* "nnn;command"            */
  711. Xchar v_passed    []="_passed";    /* passed arguments to source file    */
  712. Xchar v_path    []="_path";    /* search path for external commands    */
  713. Xchar v_gotofwd    []="_gtf";    /* set name for fwd goto name        */
  714. Xchar v_linenum    []="_linenum";    /* name for forline line #        */
  715. X
  716. Xstruct HIST *H_head, *H_tail;    /* HISTORY lists */
  717. X
  718. Xstruct PERROR Perror[]= {    /* error code->string */
  719. X    103,    "Insufficient free storage",
  720. X    105,    "Task table full",
  721. X    120,    "Argument line invalid or too long",
  722. X    121,    "File is not an object module",
  723. X    122,    "Invalid resident library during load",
  724. X    201,    "No default directory",
  725. X    202,    "Object in use",
  726. X    203,    "Object already exists",
  727. X    204,    "Directory not found",
  728. X    205,    "Object not found",
  729. X    206,    "Bad stream name",
  730. X    207,    "Object too large",
  731. X    209,    "Action not known",
  732. X    210,    "Invalid stream component name",
  733. X    211,    "Invalid object lock",
  734. X    212,    "Object not of required type",
  735. X    213,    "Disk not validated",
  736. X    214,    "Disk write protected",
  737. X    215,    "Rename across devices",
  738. X    216,    "Directory not empty",
  739. X    217,    "Too many levels",
  740. X    218,    "Device not mounted",
  741. X    219,    "Seek error",
  742. X    220,    "Comment too long",
  743. X    221,    "Disk full",
  744. X    222,    "File delete protected",
  745. X    223,    "File write protected",
  746. X    224,    "File read protected",
  747. X    225,    "Not a DOS disk",
  748. X    226,    "No disk",
  749. X
  750. X /* custom error messages */
  751. X
  752. X    500,    "Bad arguments",
  753. X    501,    "Label not found",
  754. X    502,    "Must be within source file",
  755. X    503,    "Syntax Error",
  756. X    504,    "Redirection error",
  757. X    505,    "Pipe error",
  758. X    506,    "Too many arguments",
  759. X    507,    "Destination not a directory",
  760. X    508,    "Cannot mv a filesystem",
  761. X    509,    "Error in command name",
  762. X    510,    "Bad drive name",
  763. X    511,    "Illegal number",
  764. X    0,    NULL
  765. X};
  766. X
  767. Xchar *av[MAXAV];        /* Internal argument list        */
  768. Xlong Src_base[MAXSRC];        /* file pointers for source files    */
  769. Xlong Src_pos[MAXSRC];        /* seek position storage for same    */
  770. Xchar If_base[MAXIF];        /* If/Else stack for conditionals    */
  771. Xint H_len, H_tail_base;        /* History associated stuff        */
  772. Xint H_stack;            /* AddHistory disable stack        */
  773. Xint E_stack;            /* Exception disable stack        */
  774. Xint Src_stack, If_stack;    /* Stack Indexes            */
  775. Xint forward_goto;        /* Flag for searching for foward lables    */
  776. Xint ac;                /* Internal argc            */
  777. Xint debug;            /* Debug mode                */
  778. Xint disable;            /* Disable com. execution (conditionals)*/
  779. Xint Verbose;            /* Verbose mode for source files    */
  780. Xint Lastresult;            /* Last return code            */
  781. Xint Exec_abortline;        /* flag to abort rest of line        */
  782. Xint Quit;            /* Quit flag                */
  783. Xlong Cout, Cin;            /* Current input and output file handles*/
  784. Xlong Cout_append;        /* append flag for Cout            */
  785. Xchar *Cin_name, *Cout_name;    /* redirection input/output name or NULL*/
  786. Xchar *Pipe1, *Pipe2;        /* the two pipe temp. files        */
  787. Xstruct Process *Myprocess;
  788. Xstruct CommandLineInterface *Mycli;
  789. Xint S_histlen = 20;        /* Max # history entries        */
  790. Xunsigned int options;
  791. END_OF_FILE
  792. if test 3551 -ne `wc -c <'src/globals.c'`; then
  793.     echo shar: \"'src/globals.c'\" unpacked with wrong size!
  794. fi
  795. # end of 'src/globals.c'
  796. fi
  797. if test -f 'src/main.c' -a "${1}" != "-c" ; then 
  798.   echo shar: Will not clobber existing file \"'src/main.c'\"
  799. else
  800. echo shar: Extracting \"'src/main.c'\" \(4936 characters\)
  801. sed "s/^X//" >'src/main.c' <<'END_OF_FILE'
  802. X/*
  803. X * MAIN.C
  804. X *
  805. X * Matthew Dillon, 24 Feb 1986
  806. X * (c)1986 Matthew Dillon     9 October 1986
  807. X *
  808. X * Version 2.07M by Steve Drew 10-Sep-87
  809. X *
  810. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  811. X *
  812. X */
  813. X
  814. Xchar shellname[]="Shell V4.02A";
  815. Xchar shellctr []="CshCounter";
  816. X
  817. Xint aux; /* for use with aux: driver */
  818. Xchar *oldtitle;
  819. Xchar trueprompt[100];
  820. Xchar Inline[260];
  821. Xstruct IntuitionBase *IntuitionBase;
  822. Xstruct Window *w;
  823. Xstruct ArpBase *ArpBase;
  824. X
  825. Xmain(argc, argv)
  826. Xregister char *argv[];
  827. X{
  828. X#if RAW_CONSOLE
  829. X    char *rawgets();
  830. X#endif
  831. X
  832. Xregister unsigned int i;
  833. Xextern int Enable_Abort;
  834. Xchar buf[10];
  835. Xstatic char pipe1[32], pipe2[32];
  836. Xstruct Window *getwindow();
  837. X
  838. XArpBase=(struct ArpBase *)OpenLibrary("arp.library",34L);
  839. Xif (ArpBase==NULL) { printf("No arp library\n"); exit(0); }
  840. X
  841. XForbid();
  842. X
  843. Xi=0;
  844. Xif (Getenv(shellctr,buf,10L)) i=atoi(buf);
  845. Xsprintf(buf, "%d", i+1);
  846. XSetenv(shellctr, buf);
  847. XPermit();
  848. X
  849. XIntuitionBase=(struct IntuitionBase *)ArpBase->IntuiBase;
  850. X
  851. Xstdin->_flags    |= 0x80;    /* make sure we're set as a tty */
  852. Xstdout->_flags    |= 0x80;    /* in case of redirection in .login */
  853. XClose(_devtab[2].fd);
  854. X_devtab[2].mode |= O_STDIO;
  855. X_devtab[2].fd = _devtab[1].fd;    /* set stderr to Output() otherwise */
  856. X                /* don't work with aux driver */
  857. XMyprocess = (struct Process *)FindTask(0L);
  858. XMycli=(struct CommandLineInterface *)((long)Myprocess->pr_CLI << 2);
  859. Xw=getwindow();
  860. X
  861. Xoldtitle=(char *)(w->Title);
  862. X
  863. XPipe1 = pipe1;
  864. XPipe2 = pipe2;
  865. Xsprintf(pipe1, "ram:pipe1_%ld", Myprocess);
  866. Xsprintf(pipe2, "ram:pipe2_%ld", Myprocess);
  867. X
  868. Xsprintf(buf,"%ld",Myprocess->pr_TaskNum);
  869. Xset_var(LEVEL_SET, "_clinumber", buf);
  870. X
  871. Xset_var(LEVEL_SET, v_titlebar, shellname);
  872. Xset_var(LEVEL_SET, v_prompt,
  873. X    (IsInteractive(Input())) ? "\23337m%p> \2330m" : "");
  874. Xset_var(LEVEL_SET, v_hist, "20");
  875. Xset_var(LEVEL_SET, v_lasterr, "0");
  876. Xset_var(LEVEL_SET, v_stat, "0");
  877. Xset_var(LEVEL_SET, v_path, "RAM:,RAM:c/,df0:c/,df1:c/,sys:system/");
  878. Xset_var(LEVEL_SET, "_insert", "1");
  879. Xset_var(LEVEL_SET, "f1", "cdir df0:\15");
  880. Xset_var(LEVEL_SET, "F1", "cdir df1:\15");
  881. Xset_var(LEVEL_SET, "f3", "cdir RAM:\15");
  882. Xset_var(LEVEL_SET, "F3", "cdir vd0:\15");
  883. Xset_var(LEVEL_SET, "f4", "cd df0:\15");
  884. Xset_var(LEVEL_SET, "F4", "cd df1:\15");
  885. Xset_var(LEVEL_SET, "f5", "cls; ls\15");
  886. Xset_var(LEVEL_SET, "F5", "cdir ");
  887. Xset_var(LEVEL_SET, "f6", "ls -s\15");
  888. Xset_var(LEVEL_SET, "f7", "info\15");
  889. Xset_var(LEVEL_SET, "F7", "assign \15");
  890. Xset_var(LEVEL_SET, "f8", "window -lf\15");
  891. Xset_var(LEVEL_SET, "F8", "window -sb\15");
  892. Xset_var(LEVEL_SET, "f10", "cls\15");
  893. Xset_var(LEVEL_SET, "F10", "exit\15");
  894. Xset_var(LEVEL_ALIAS, "cls", "echo -n ^l");
  895. Xset_var(LEVEL_ALIAS, "kr", "rm -r RAM:* >NIL:");
  896. Xset_var(LEVEL_ALIAS, "cdir", "%q cd $q; cls; dir");
  897. Xset_var(LEVEL_ALIAS, "exit", "endcli;quit");
  898. Xset_var(LEVEL_ALIAS, "lp", "cat >PRT:");
  899. Xset_var(LEVEL_ALIAS, "manlist", "sea -qwn doc:shell.doc \"    *\"");
  900. Xseterr();
  901. Xif (Myprocess->pr_CurrentDir == NULL)
  902. X    do_cd("x :");
  903. Xelse do_pwd(NULL);
  904. XEnable_Abort = 0;
  905. X
  906. Xif (exists(av[1] = "S:.login")) do_source("x S:.login");
  907. X
  908. Xfor (i = 1; i < argc; ++i) {
  909. X    if (!strcmp(argv[i],"-c")) {
  910. X        Inline[0] = ' ';
  911. X        Inline[1] = '\0';
  912. X        while (++i < argc)
  913. X            { strcat(Inline,argv[i]); strcat(Inline," "); }
  914. X        exec_command(Inline);
  915. X        main_exit(Lastresult);
  916. X        }
  917. X    if (!strcmp(argv[i],"-a")) { aux = 1; continue; }
  918. X    sprintf (Inline, "source %s",argv[i]);
  919. X    av[1] = argv[i];
  920. X    do_source (Inline);
  921. X    }
  922. Xfor (;;) {
  923. X   if (breakcheck())
  924. X    while (WaitForChar(Input(), 100L) || stdin->_bp < stdin->_bend)
  925. X        gets(Inline);
  926. X   clearerr(stdin);  /* prevent acidental quit */
  927. X#if RAW_CONSOLE
  928. X   if (Quit || !rawgets(Inline, disable ? "_ " : trueprompt)) main_exit(0);
  929. X#else
  930. X   printf("%s", disable ? "_ " : trueprompt);
  931. X   fflush(stdout);
  932. X   if (Quit || !gets(Inline)) main_exit(0);
  933. X#endif
  934. X   breakreset();
  935. X   if (*Inline) exec_command(Inline);
  936. X   }
  937. X}
  938. X
  939. Xmain_exit(n)
  940. X{
  941. Xregister int i;
  942. Xchar buf[10];
  943. X
  944. XGetenv(shellctr,buf,10L);
  945. Xi=atoi(buf);
  946. Xsprintf(buf,"%d",i-1);
  947. XSetenv(shellctr,buf);
  948. XSetWindowTitles(w,oldtitle,-1L);
  949. Xfor (i=1; i<MAXMYFILES; i++) myclose(i);
  950. XCloseLibrary(ArpBase);
  951. Xexit(0);
  952. X}
  953. X
  954. Xbreakcheck()
  955. X{
  956. Xreturn (int)(SetSignal(0L,0L) & SIGBREAKF_CTRL_C);
  957. X}
  958. X
  959. Xbreakreset()
  960. X{
  961. XSetSignal(0L, SIGBREAKF_CTRL_C);
  962. X}
  963. X
  964. Xdobreak()
  965. X{
  966. Xif (breakcheck()) { printf("^C\n"); return(1); }
  967. Xreturn(0);
  968. X}
  969. X
  970. X/* this routine causes manx to use this Chk_Abort() rather than it's own */
  971. X/* otherwise it resets our ^C when doing any I/O (even when Enable_Abort */
  972. X/* is zero).  Since we want to check for our own ^C's             */
  973. X
  974. XChk_Abort()
  975. X{
  976. Xreturn(0);
  977. X}
  978. X
  979. X_wb_parse()
  980. X{
  981. X}
  982. X
  983. Xdo_howmany()
  984. X{
  985. Xchar buf[10];
  986. X
  987. XGetenv(shellctr, buf, 10L);
  988. Xprintf("Shell(s) running: %s\n",buf);
  989. X}
  990. X
  991. Xstruct Window *getwindow()
  992. X{
  993. Xstruct InfoData *infodata;
  994. Xstruct Window *win;
  995. Xlong args[8];
  996. X
  997. Xinfodata=AllocMem((long)sizeof(struct InfoData),MEMF_CLEAR | MEMF_PUBLIC);
  998. Xargs[0]=(long)infodata >> 2;
  999. XSendPacket(ACTION_DISK_INFO,args,Myprocess->pr_ConsoleTask);
  1000. Xwin=(struct Window *)infodata->id_VolumeNode;
  1001. XFreeMem(infodata,(long)sizeof(struct InfoData));
  1002. Xreturn win;
  1003. X}
  1004. END_OF_FILE
  1005. if test 4936 -ne `wc -c <'src/main.c'`; then
  1006.     echo shar: \"'src/main.c'\" unpacked with wrong size!
  1007. fi
  1008. # end of 'src/main.c'
  1009. fi
  1010. if test -f 'src/makefile' -a "${1}" != "-c" ; then 
  1011.   echo shar: Will not clobber existing file \"'src/makefile'\"
  1012. else
  1013. echo shar: Extracting \"'src/makefile'\" \(1019 characters\)
  1014. sed "s/^X//" >'src/makefile' <<'END_OF_FILE'
  1015. X######################################################################
  1016. X#
  1017. X# Makefile to build Shell 4.01A
  1018. X# by Carlo Borreo & Cesare Dieni 17-Feb-90
  1019. X#
  1020. X######################################################################
  1021. X
  1022. XOBJS    = run.o main.o comm1.o comm2.o comm3.o execom.o set.o sub.o \
  1023. X      globals.o rawconsole.o
  1024. X
  1025. XINCL    = shell.h
  1026. X
  1027. XShell   : Shell.syms $(OBJS)
  1028. X    ln  +q -m -o Shell $(OBJS) -la -lc32
  1029. X
  1030. XShell.syms : $(INCL)
  1031. X    cc +L +HShell.syms shell.h -DAZTEC_C
  1032. X
  1033. Xrawconsole.o : rawconsole.c $(INCL)
  1034. X    cc +L +IShell.syms rawconsole.c
  1035. X
  1036. Xrun.o   : run.c $(INCL)
  1037. X    cc +L +IShell.syms run.c
  1038. X
  1039. Xmain.o  : main.c $(INCL)
  1040. X    cc +L +IShell.syms main.c
  1041. X
  1042. Xcomm1.o : comm1.c $(INCL)
  1043. X    cc +L +IShell.syms comm1.c
  1044. X
  1045. Xcomm2.o : comm2.c $(INCL)
  1046. X    cc +L +IShell.syms comm2.c
  1047. X
  1048. Xcomm3.o : comm3.c $(INCL)
  1049. X    cc +L +IShell.syms comm3.c
  1050. X
  1051. Xset.o   : set.c $(INCL)
  1052. X    cc +L +IShell.syms set.c
  1053. X
  1054. Xsub.o   : sub.c $(INCL)
  1055. X    cc +L +IShell.syms sub.c
  1056. X
  1057. Xglobals.o : globals.c $(INCL)
  1058. X    cc +L +IShell.syms globals.c
  1059. X
  1060. Xexecom.o : execom.c $(INCL)
  1061. X    cc +L +IShell.syms execom.c
  1062. END_OF_FILE
  1063. if test 1019 -ne `wc -c <'src/makefile'`; then
  1064.     echo shar: \"'src/makefile'\" unpacked with wrong size!
  1065. fi
  1066. # end of 'src/makefile'
  1067. fi
  1068. if test -f 'src/rawconsole.c' -a "${1}" != "-c" ; then 
  1069.   echo shar: Will not clobber existing file \"'src/rawconsole.c'\"
  1070. else
  1071. echo shar: Extracting \"'src/rawconsole.c'\" \(9156 characters\)
  1072. sed "s/^X//" >'src/rawconsole.c' <<'END_OF_FILE'
  1073. X/*
  1074. X * RawConsole.c
  1075. X *
  1076. X * Shell 2.07M  17-Jun-87
  1077. X * console handling, command line editing support for Shell
  1078. X * using new console packets from 1.2.
  1079. X * Written by Steve Drew. (c) 14-Oct-86.
  1080. X * 16-Dec-86 Slight mods to rawgets() for Disktrashing.
  1081. X *
  1082. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  1083. X *
  1084. X */
  1085. X
  1086. X#if RAW_CONSOLE
  1087. X
  1088. Xchar *tyahdptr;
  1089. X
  1090. Xmyget()
  1091. X{
  1092. Xif (*tyahdptr) return *tyahdptr++;
  1093. Xreturn getchar();
  1094. X}
  1095. X
  1096. Xextern int aux; /* for use with aux: */
  1097. X
  1098. X#define SETRAW setrawcon(-1L);
  1099. X#define SETCON setrawcon(0L);
  1100. X
  1101. Xint width;
  1102. X
  1103. Xnewwidth()
  1104. X{
  1105. Xextern struct Window *w;
  1106. X
  1107. Xwidth=(w->Width- (w->BorderLeft + w->BorderRight)) / w->RPort->TxWidth;
  1108. X}
  1109. X
  1110. Xchar *rawgets(line,prompt)
  1111. Xchar *line, *prompt;
  1112. X{
  1113. Xchar *get_var();
  1114. Xchar *gets();
  1115. Xregister int n, pl;
  1116. Xregister int max, i;
  1117. Xunsigned char c1,c2,c3;
  1118. Xchar fkeys[5];
  1119. Xchar *s;
  1120. Xchar *ps;
  1121. Xchar typeahd[256];
  1122. Xint fkey, savn;
  1123. Xint insert = 1;
  1124. Xint recall = -1;
  1125. Xstruct HIST *hist;
  1126. X
  1127. Xnewwidth();
  1128. X
  1129. Xif (aux) {
  1130. X    printf("%s",prompt);
  1131. X    fflush(stdout);
  1132. X    }
  1133. Xif (!IsInteractive(Input()) || aux ) return(gets(line));
  1134. Xif (WaitForChar((long)Input(), 100L) ||   /* don't switch to 1L ...*/
  1135. X        stdin->_bp < stdin->_bend) {     /* else causes read err's*/
  1136. X    gets(line);
  1137. X    return(line);
  1138. X    }
  1139. XSETRAW;
  1140. Xprintf("\015%s\2336n",prompt);
  1141. Xsavn = pl = n = 0;
  1142. Xtyahdptr = typeahd;
  1143. Xwhile((typeahd[n]=getchar()) != 'R') {
  1144. X    if ((unsigned char)typeahd[n] == 155) savn = n;
  1145. X    n++;
  1146. X    }
  1147. X    /* typeahd now contains possible type a head chars
  1148. X       followed by <CSI> cursor position report.
  1149. X    */
  1150. Xtypeahd[savn]  = '\0';
  1151. Xif (typeahd[n-2] != ';') pl = (typeahd[n-2] - 48) * 10;
  1152. Xpl += typeahd[n-1] - 49;
  1153. Xps = line + pl;
  1154. Xline[max = i = pl] = '\0';
  1155. X
  1156. Xif (s = get_var (LEVEL_SET, "_insert")) insert = atoi(s) ? 1 : 0;
  1157. X
  1158. Xwhile( (c1 = myget()) != 255) {
  1159. X        switch(c1) {
  1160. X            case 155:
  1161. X                 c2 = myget();
  1162. X                 switch(c2) {
  1163. X                     case 'A':                  /* up arrow   */
  1164. X                        n = ++recall;
  1165. X                     case 'B':                  /* down arrow */
  1166. X                        line[pl] = '\0';
  1167. X                        if (recall >= 0 || c2 == 'A') {
  1168. X                            if (c2 == 'B') n = --recall;
  1169. X                            if (recall >= 0) {
  1170. X                                for(hist = H_head; hist && n--;
  1171. X                                    hist = hist->next);
  1172. X                                if (hist) strcpy(&line[pl],hist->line);
  1173. X                                else recall = H_len;
  1174. X                            }
  1175. X                        }
  1176. X                        if (i != pl)
  1177. X                            printf("\233%dD",i);
  1178. X                        printf("\015\233J%s%s",prompt,ps);
  1179. X                        i = max = strlen(ps) + pl;
  1180. X                        break;
  1181. X                     case 'C':                  /* right arrow*/
  1182. X                        if (i < max) {
  1183. X                            i++;
  1184. X                            printf("\233C");
  1185. X                        }
  1186. X                        break;
  1187. X                     case 'D':                  /* left arrow */
  1188. X                        if (i > pl) {
  1189. X                            i--;
  1190. X                            printf("\233D");
  1191. X                        }
  1192. X                        break;
  1193. X                     case 'T':           /* shift-up   */
  1194. X                       n = recall = H_len-1;
  1195. X                     case 'S':           /* shift-down */
  1196. X                       line[pl] = '\0';
  1197. X                       if (c2 == 'S') {
  1198. X                           n = recall = 0;
  1199. X                           if (H_head) strcpy(&line[pl], H_head->line);
  1200. X                       }
  1201. X                       else if (H_tail) strcpy(&line[pl], H_tail->line);
  1202. X                       printf("\015\233J%s%s", prompt, ps);
  1203. X                       i = max = strlen(ps) + pl;
  1204. X                       break;
  1205. X                    case ' ':                   /* shift -> <-*/
  1206. X                        c3 = myget();
  1207. X                                     switch(c3) {
  1208. X                    case('@'):      /* shift ->   */
  1209. X                        while (ps[i-pl-1] == ' ' && i<max) {
  1210. X                          i++;
  1211. X                          printf("\233C");
  1212. X                }
  1213. X                        while (ps[i-pl-1] != ' ' && i<max) {
  1214. X                          i++;
  1215. X                    printf("\233C");
  1216. X                       }
  1217. X                        break;
  1218. X                    case('A'):      /* shift <-   */
  1219. X                        while (ps[i-pl-1] == ' ' && i>pl) {
  1220. X                            i--;
  1221. X                            printf("\233D");
  1222. X                        }
  1223. X                        while (ps[i-pl-1] != ' ' && i>pl) {
  1224. X                            i--;
  1225. X                            printf("\233D");
  1226. X                        }
  1227. X                        break;
  1228. X                        default:
  1229. X                        break;
  1230. X                    }
  1231. X                        break;
  1232. X                    default:
  1233. X                        c3 = myget();
  1234. X                        if (c3 == '~') {
  1235. X                            fkey = c2;
  1236. X                            fkeys[0] = 'f';
  1237. X                            if (c2 == '?') {
  1238. X                                strcpy(ps,"help");
  1239. X                                goto done;
  1240. X                            }
  1241. X                        }
  1242. X                        else if (myget() != '~') { /* window was resized */
  1243. X                            while(myget() != '|');
  1244. X                            newwidth();
  1245. X                            break;
  1246. X                        }
  1247. X                        else {
  1248. X                            fkey = c3;
  1249. X                            fkeys[0] = 'F';
  1250. X                        }
  1251. X                        sprintf(fkeys+1,"%d",fkey - 47);
  1252. X                        if (s = get_var(LEVEL_SET, fkeys))
  1253. X                                tyahdptr = strcpy(typeahd,s);
  1254. X                        break;
  1255. X                    }
  1256. X                break;
  1257. X            case 8:
  1258. X                if (i > pl) {
  1259. X                    i--;
  1260. X                    printf("\010");
  1261. X                }
  1262. X                else break;
  1263. X            case 127:
  1264. X                if (i < max) {
  1265. X                    int j,t,l = 0;
  1266. X                    movmem(&line[i+1],&line[i],max-i);
  1267. X                    --max;
  1268. X                    printf("\233P");
  1269. X                    j = width - i % width - 1;   /* amount to end     */
  1270. X                    t = max/width - i/width;     /* no of lines       */
  1271. X                    for(n = 0; n < t; n++) {
  1272. X                        l += j;                  /* no. of char moved */
  1273. X                        if (j) printf("\233%dC",j); /* goto eol       */
  1274. X                        printf("%c\233P",line[width*(i/width+n+1)-1]);
  1275. X                        j = width-1;
  1276. X                    }
  1277. X                    if (t)
  1278. X                    printf("\233%dD",l+t);   /* get back */
  1279. X                }
  1280. X                break;
  1281. X            case 18:
  1282. X                n = i/width;
  1283. X                if (n) printf("\233%dF",n);
  1284. X                printf("\015\233J%s%s",prompt,ps);
  1285. X                i = max;
  1286. X                break;
  1287. X            case 27:
  1288. X                break;
  1289. X            case 1:
  1290. X                insert ^= 1;
  1291. X                break;
  1292. X            case 21:
  1293. X            case 24:
  1294. X            case 26:
  1295. X                if (i>pl) printf("\233%dD",i-pl);
  1296. X                i = pl;
  1297. X                if (c1 == 26) break;
  1298. X            case 11:        /* ^K */
  1299. X                printf("\233J");
  1300. X                max = i;
  1301. X                line[i] = '\0';
  1302. X                break;
  1303. X            case 28:        /* ^\ */
  1304. X                SETCON;
  1305. X                return(NULL);
  1306. X            case 5:
  1307. X                if (i!=max) printf("\233%dC",max - i);
  1308. X                i = max;
  1309. X                break;
  1310. X            case 10:
  1311. X            case 13:
  1312. X                line[max] = '\0';
  1313. Xdone:           printf("\233%dC\n",max - i);
  1314. X
  1315. X                SETCON;
  1316. X                strcpy(line, ps);
  1317. X                return(line);
  1318. X            default:
  1319. X                c1 &= 0x7f;
  1320. X                if (c1 == 9) c1 = 32;
  1321. X                if (c1 > 31 & i < 256) {
  1322. X                    if (i < max && insert) {
  1323. X                        int j,t,l = 0;
  1324. X                        movmem(&line[i], &line[i+1], max - i);
  1325. X                        printf("\233@%c",c1);
  1326. X                        t = max/width - i/width;
  1327. X                        j = width - i % width - 1;
  1328. X                        for(n = 0; n < t; n++) {
  1329. X                            l += j;
  1330. X                            if (j) printf("\233%dC",j);
  1331. X                            printf("\233@%c",line[width*(i/width+n+1)]);
  1332. X                            j = width-1;
  1333. X                        }
  1334. X                        if (t) printf("\233%dD",l + t);
  1335. X                        ++max;
  1336. X                    }
  1337. X                    else {
  1338. X                        if(i == pl && max == i) printf("\015%s%s",prompt,ps);
  1339. X                        putchar(c1);
  1340. X                    }
  1341. X                    line[i++] = c1;
  1342. X                    if (max < i) max = i;
  1343. X                    line[max] = '\0';
  1344. X                }
  1345. X        }
  1346. X    }
  1347. XSETCON;
  1348. Xreturn(NULL);
  1349. X}
  1350. X
  1351. Xsetrawcon(flag) /* -1L=RAW:, 0L=CON: */
  1352. Xlong flag;
  1353. X{
  1354. Xlong packargs[8];
  1355. X
  1356. Xpackargs[0]=flag;
  1357. XSendPacket(994L, packargs, Myprocess->pr_ConsoleTask);
  1358. X}
  1359. X
  1360. X#endif
  1361. END_OF_FILE
  1362. if test 9156 -ne `wc -c <'src/rawconsole.c'`; then
  1363.     echo shar: \"'src/rawconsole.c'\" unpacked with wrong size!
  1364. fi
  1365. # end of 'src/rawconsole.c'
  1366. fi
  1367. if test -f 'src/run.c' -a "${1}" != "-c" ; then 
  1368.   echo shar: Will not clobber existing file \"'src/run.c'\"
  1369. else
  1370. echo shar: Extracting \"'src/run.c'\" \(1712 characters\)
  1371. sed "s/^X//" >'src/run.c' <<'END_OF_FILE'
  1372. X
  1373. X/*
  1374. X * RUN.C
  1375. X *
  1376. X * (c)1986 Matthew Dillon     9 October 1986
  1377. X *
  1378. X *    RUN   handles running of external commands.
  1379. X *
  1380. X * Version 2.07M by Steve Drew 10-Sep-87
  1381. X *
  1382. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  1383. X *
  1384. X */
  1385. X
  1386. Xchar *FindIt();
  1387. X
  1388. Xdo_run(str)
  1389. Xchar *str;
  1390. X{
  1391. Xint retcode;
  1392. Xchar buf[200]; /* enough space for 100 char cmd name + path stuff */
  1393. Xchar *path, *argline, *trueargline, *copy, *p = av[0];
  1394. X
  1395. Xwhile(*p++) *p &= 0x7F;      /* allow "com mand" */
  1396. X
  1397. Xargline=compile_av(av, 1, ac, ' ', 1);
  1398. Xtrueargline= (*argline ? argline : "\n");
  1399. X
  1400. Xif (strlen(av[0]) > 100) { ierror(NULL,509); return -1; }
  1401. X
  1402. Xsprintf(buf,"res_%s",BaseName(av[0]));
  1403. Xif (Getenv(buf, buf+100, 90L) && loadres(av[0])) Setenv(buf,NULL);
  1404. Xretcode=SyncRun(av[0],trueargline,0L,0L);
  1405. Xif (retcode>=0) { free(argline); return retcode; }
  1406. Xif (path = FindIt(av[0],"",buf)) {
  1407. X    retcode = SyncRun(path,trueargline,0L,0L);
  1408. X    free(argline);
  1409. X    return retcode;
  1410. X    }
  1411. Xelse free(argline);
  1412. Xif ((path = FindIt(av[0],".sh",buf)) == NULL) {
  1413. X    fprintf(stderr,"Command Not Found %s\n",av[0]);
  1414. X    return -1;
  1415. X    }
  1416. Xav[1] = buf;
  1417. Xcopy = malloc(strlen(str)+3);
  1418. Xsprintf(copy,"x %s",str);
  1419. Xretcode = do_source(copy);
  1420. Xfree(copy);
  1421. Xreturn retcode;
  1422. X}
  1423. X
  1424. Xchar *dofind(cmd, ext, buf)
  1425. Xchar *cmd, *ext, *buf;
  1426. X{
  1427. Xchar *ptr, *s;
  1428. X
  1429. Xsprintf(buf,"%s%s",cmd,ext);
  1430. Xif (exists(buf)) return buf;
  1431. Xif (BaseName(buf)==buf) {
  1432. X    s = get_var(LEVEL_SET, v_path);
  1433. X    while (*s) {
  1434. X        for (ptr=buf; *s && *s!=','; ) *ptr++ = *s++;
  1435. X        sprintf(ptr, "%s%s", cmd, ext);
  1436. X        if (exists(buf)) return buf;
  1437. X        if (*s) s++;
  1438. X        }
  1439. X    }
  1440. Xreturn NULL;
  1441. X}
  1442. X
  1443. Xchar *FindIt(cmd,ext,buf)
  1444. Xchar *cmd, *ext, *buf;
  1445. X{
  1446. Xchar *response;
  1447. X
  1448. XMyprocess->pr_WindowPtr = (APTR)(-1);
  1449. Xresponse=dofind(cmd,ext,buf);
  1450. XMyprocess->pr_WindowPtr = NULL;
  1451. Xreturn response;
  1452. X}
  1453. END_OF_FILE
  1454. if test 1712 -ne `wc -c <'src/run.c'`; then
  1455.     echo shar: \"'src/run.c'\" unpacked with wrong size!
  1456. fi
  1457. # end of 'src/run.c'
  1458. fi
  1459. if test -f 'src/set.c' -a "${1}" != "-c" ; then 
  1460.   echo shar: Will not clobber existing file \"'src/set.c'\"
  1461. else
  1462. echo shar: Extracting \"'src/set.c'\" \(3884 characters\)
  1463. sed "s/^X//" >'src/set.c' <<'END_OF_FILE'
  1464. X
  1465. X/*
  1466. X * SET.C
  1467. X *
  1468. X * (c)1986 Matthew Dillon     9 October 1986
  1469. X *
  1470. X * Version 2.07M by Steve Drew 10-Sep-87
  1471. X *
  1472. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  1473. X *
  1474. X */
  1475. X
  1476. Xextern struct Window *w;
  1477. X
  1478. X#define MAXLEVELS (3 + MAXSRC)
  1479. X
  1480. Xstruct MASTER {
  1481. X    struct MASTER *next;
  1482. X    struct MASTER *last;
  1483. X    char *name;
  1484. X    char *text;
  1485. X};
  1486. X
  1487. Xstatic struct MASTER *Mbase[MAXLEVELS];
  1488. X
  1489. Xchar *set_var(level, name, str)
  1490. Xregister char *name, *str;
  1491. X{
  1492. X   register struct MASTER *base = Mbase[level];
  1493. X   register struct MASTER *last;
  1494. X   register int len;
  1495. X
  1496. X   for (len = 0; isalphanum(name[len]); ++len);
  1497. X   while (base != NULL) {
  1498. X      if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  1499. X         Free (base->text);
  1500. X         goto gotit;
  1501. X      }
  1502. X      last = base;
  1503. X      base = base->next;
  1504. X   }
  1505. X   if (base == Mbase[level]) {
  1506. X      base = Mbase[level] = (struct MASTER *)malloc (sizeof(struct MASTER));
  1507. X      base->last = NULL;
  1508. X   } else {
  1509. X      base = (struct MASTER *)malloc (sizeof(struct MASTER));
  1510. X      base->last = last;
  1511. X      last->next = base;
  1512. X   }
  1513. X   base->name = malloc (len + 1);
  1514. X   bmov (name, base->name, len);
  1515. X   base->name[len] = 0;
  1516. X   base->next = NULL;
  1517. Xgotit:
  1518. X   base->text = malloc (strlen(str) + 1);
  1519. X   strcpy (base->text, str);
  1520. X   if (*name=='_') sys_vars();
  1521. X   return (base->text);
  1522. X}
  1523. X
  1524. Xchar *get_var (level, name)
  1525. Xregister char *name;
  1526. X{
  1527. X   register struct MASTER *base = Mbase[level];
  1528. X   register unsigned char *scr;
  1529. X   register int len;
  1530. X
  1531. X   for (scr = (unsigned char *)name; *scr && *scr != 0x80 && *scr != ' ' && *scr != ';' && *scr != '|'; ++scr);
  1532. X   len = scr - name;
  1533. X
  1534. X   while (base != NULL) {
  1535. X      if (strlen(base->name) == len && strncmp (name, base->name, len) == 0)
  1536. X         return (base->text);
  1537. X      base = base->next;
  1538. X   }
  1539. X   return (NULL);
  1540. X}
  1541. X
  1542. Xunset_level(level)
  1543. X{
  1544. X   register struct MASTER *base = Mbase[level];
  1545. X
  1546. X   while (base) {
  1547. X      Free (base->name);
  1548. X      Free (base->text);
  1549. X      Free (base);
  1550. X      base = base->next;
  1551. X   }
  1552. X   Mbase[level] = NULL;
  1553. X}
  1554. X
  1555. Xunset_var(level, name)
  1556. Xchar *name;
  1557. X{
  1558. X   register struct MASTER *base = Mbase[level];
  1559. X   register struct MASTER *last = NULL;
  1560. X   register int len;
  1561. X
  1562. X   for (len = 0; isalphanum(name[len]); ++len);
  1563. X   while (base) {
  1564. X      if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  1565. X         if (base != Mbase[level])
  1566. X            last->next = base->next;
  1567. X         else
  1568. X            Mbase[level] = base->next;
  1569. X         if (base->next != NULL)
  1570. X            base->next->last = last;
  1571. X         if (base == Mbase[level])
  1572. X            Mbase[level] = base->next;
  1573. X         Free (base->name);
  1574. X         Free (base->text);
  1575. X         Free (base);
  1576. X         return (1);
  1577. X      }
  1578. X      last = base;
  1579. X      base = base->next;
  1580. X   }
  1581. X   return (-1);
  1582. X}
  1583. X
  1584. Xdo_unset_var(str, level)
  1585. Xchar *str;
  1586. X{
  1587. Xregister unsigned int i;
  1588. X
  1589. Xfor (i = 1; i < ac; ++i) unset_var (level, av[i]);
  1590. Xsys_vars();
  1591. Xreturn 0;
  1592. X}
  1593. X
  1594. Xdo_set_var(command, level)
  1595. Xchar *command;
  1596. X{
  1597. Xregister struct MASTER *base = Mbase[level];
  1598. Xregister char *str;
  1599. X
  1600. Xswitch (ac) {
  1601. Xcase 1:
  1602. X    while (base && !dobreak()) {
  1603. X        printf ("\2330m%-10s %s\n", base->name, base->text);
  1604. X        base = base->next;
  1605. X        }
  1606. X    break;
  1607. Xcase 2:
  1608. X    if (str=get_var(level,av[1])) printf ("%-10s %s\n", av[1], str);
  1609. X    break;
  1610. Xdefault:
  1611. X    set_var (level, av[1], next_word (next_word (command)));
  1612. X    if (*av[1]=='_') sys_vars();
  1613. X    break;
  1614. X    }
  1615. Xreturn 0;
  1616. X}
  1617. X
  1618. Xsys_vars()
  1619. X{
  1620. Xregister char *str, *t;
  1621. Xextern char trueprompt[100];
  1622. X
  1623. Xif (strcmp(w->Title, str=get_var(LEVEL_SET, v_titlebar)))
  1624. X    SetWindowTitles(w, str, -1L);
  1625. XS_histlen=(str = get_var(LEVEL_SET, v_hist)) ? atoi(str) : 0;
  1626. Xdebug  =(get_var(LEVEL_SET, v_debug)  !=NULL);
  1627. XVerbose=(get_var(LEVEL_SET, v_verbose)!=NULL);
  1628. Xif (S_histlen < 2) S_histlen=2;
  1629. X
  1630. Xif ( (str=get_var(LEVEL_SET,v_prompt)) ==NULL) str="$ ";
  1631. Xt=trueprompt;
  1632. Xwhile (*str)
  1633. X    if (*str=='%' && str[1]=='p') {
  1634. X        str+=2;
  1635. X        strcpy(t,get_var(LEVEL_SET, "_cwd"));
  1636. X        t+=strlen(t);
  1637. X        }
  1638. X    else *t++=*str++;
  1639. Xstrcpy(t,"\2330m");
  1640. X}
  1641. END_OF_FILE
  1642. if test 3884 -ne `wc -c <'src/set.c'`; then
  1643.     echo shar: \"'src/set.c'\" unpacked with wrong size!
  1644. fi
  1645. # end of 'src/set.c'
  1646. fi
  1647. if test -f 'src/shell.h' -a "${1}" != "-c" ; then 
  1648.   echo shar: Will not clobber existing file \"'src/shell.h'\"
  1649. else
  1650. echo shar: Extracting \"'src/shell.h'\" \(3029 characters\)
  1651. sed "s/^X//" >'src/shell.h' <<'END_OF_FILE'
  1652. X
  1653. X/*
  1654. X * SHELL.H
  1655. X *
  1656. X * (c)1986 Matthew Dillon     9 October 1986
  1657. X *
  1658. X *
  1659. X * SHELL include file.. contains shell parameters and extern's
  1660. X *
  1661. X * Version 2.07M by Steve Drew 10-Sep-87
  1662. X *
  1663. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  1664. X *
  1665. X */
  1666. X
  1667. X#define RAW_CONSOLE 1   /* Set to 0 to compile out Cmd Line Editing */
  1668. X
  1669. X#include <stdio.h>
  1670. X#include <exec/exec.h>
  1671. X#include <time.h>
  1672. X#include <libraries/dos.h>
  1673. X#include <libraries/dosextens.h>
  1674. X#include <intuition/intuition.h>
  1675. X#include <intuition/intuitionbase.h>
  1676. X#include "shellfunctions.h"
  1677. X#include <fcntl.h>
  1678. X#include <libraries/arpbase.h>
  1679. X
  1680. Xtypedef struct FileInfoBlock FIB;
  1681. X
  1682. X#define bmov movmem
  1683. X
  1684. X#define MAXAV        256        /* Max. # arguments        */
  1685. X#define MAXSRC        5        /* Max. # of source file levels */
  1686. X#define MAXIF        10        /* Max. # of if levels        */
  1687. X#define MAXALIAS    20        /* Max. # of alias levels    */
  1688. X#define MAXMYFILES    9        /* Max. # of internal files    */
  1689. X
  1690. X#define LEVEL_SET    0        /* which variable list to use   */
  1691. X#define LEVEL_ALIAS    1
  1692. X#define LEVEL_LABEL    2
  1693. X
  1694. X    /* EXECOM.C defines */
  1695. X
  1696. X#define FL_DOLLAR    0x01  /* One of the following */
  1697. X#define FL_BANG        0x02
  1698. X#define FL_PERCENT    0x04
  1699. X#define FL_QUOTE    0x08
  1700. X#define FL_IDOLLAR    0x10  /* Any or all of the following may be set */
  1701. X#define FL_EOC        0x20
  1702. X#define FL_EOL        0x40
  1703. X#define FL_OVERIDE    0x80
  1704. X#define FL_WILD        0x100
  1705. X#define FL_MASK        (FL_DOLLAR|FL_BANG|FL_PERCENT|FL_QUOTE)
  1706. X
  1707. X#ifndef NULL
  1708. X#define NULL 0L
  1709. X#endif
  1710. X
  1711. X#define CHECKBREAK() dobreak()
  1712. X
  1713. X#ifndef AZTEC_C
  1714. Xstruct _dev {
  1715. X    long  fd;
  1716. X    short mode;
  1717. X    };
  1718. X#endif
  1719. X
  1720. Xstruct HIST {
  1721. X    struct HIST *next, *prev;    /* doubly linked list */
  1722. X    char *line;            /* line in history    */
  1723. X};
  1724. X
  1725. Xstruct PERROR {
  1726. X    int errnum;            /* Format of global error lookup */
  1727. X    char *errstr;
  1728. X};
  1729. X
  1730. Xstruct DPTR {                /* Format of directory fetch pointer */
  1731. X    BPTR lock;            /* lock on directory   */
  1732. X    FIB *fib;            /* mod'd fib for entry */
  1733. X    };
  1734. X
  1735. Xextern struct HIST *H_head, *H_tail;
  1736. Xextern struct PERROR Perror[];
  1737. Xextern struct DPTR *dopen();
  1738. Xextern char *set_var(), *get_var(), *next_word();
  1739. Xextern char *get_history(), *compile_av(), *get_pwd();
  1740. Xextern char *malloc(), *strcpy(), *strcat(), *index();
  1741. Xextern char **expand();
  1742. Xextern char *av[];
  1743. Xextern char *Current;
  1744. Xextern int  H_len, H_tail_base, H_stack;
  1745. Xextern int  E_stack;
  1746. Xextern int  Src_stack, If_stack, forward_goto;
  1747. Xextern int  ac;
  1748. Xextern int  debug, Rval, Verbose, disable, Quit;
  1749. Xextern int  Lastresult, atoierr;
  1750. Xextern int  Exec_abortline;
  1751. Xextern int   S_histlen;
  1752. Xextern unsigned int options;
  1753. Xextern long  Cin, Cout, Cout_append;
  1754. Xextern char *Cin_name, *Cout_name;
  1755. Xextern char  Cin_type,  Cout_type;  /* these variables are in transition */
  1756. Xextern char *Pipe1, *Pipe2;
  1757. X
  1758. Xextern long Src_base[MAXSRC];
  1759. Xextern long Src_pos[MAXSRC];
  1760. Xextern char If_base[MAXIF];
  1761. Xextern struct Process *Myprocess;
  1762. Xextern struct CommandLineInterface *Mycli;
  1763. X
  1764. Xextern struct ArpBase *ArpBase;
  1765. X
  1766. Xextern long atol(), Atol(), myatol();
  1767. X
  1768. Xextern char    v_titlebar[], v_prompt[], v_hist[], v_histnum[], v_debug[],
  1769. X        v_verbose[], v_stat[], v_lasterr[], v_cwd[], v_except[],
  1770. X        v_passed[], v_path[], v_gotofwd[], v_linenum[];
  1771. END_OF_FILE
  1772. if test 3029 -ne `wc -c <'src/shell.h'`; then
  1773.     echo shar: \"'src/shell.h'\" unpacked with wrong size!
  1774. fi
  1775. # end of 'src/shell.h'
  1776. fi
  1777. if test -f 'src/shellfunctions.h' -a "${1}" != "-c" ; then 
  1778.   echo shar: Will not clobber existing file \"'src/shellfunctions.h'\"
  1779. else
  1780. echo shar: Extracting \"'src/shellfunctions.h'\" \(9694 characters\)
  1781. sed "s/^X//" >'src/shellfunctions.h' <<'END_OF_FILE'
  1782. Xtypedef    long    cList;
  1783. Xextern int Enable_Abort;
  1784. X
  1785. Xlong                    AbleICR();
  1786. Xlong                    AbortIO();
  1787. Xlong                    ActivateGadget();
  1788. Xvoid                    ActivateWindow();
  1789. Xvoid                    AddAnimOb();
  1790. Xvoid                    AddBob();
  1791. Xvoid                    AddConfigDev();
  1792. Xvoid                    AddDevice();
  1793. Xlong                    AddDosNode();
  1794. Xvoid                    AddFont();
  1795. Xvoid                    AddFreeList();
  1796. Xshort                    AddGadget();
  1797. Xunsigned short                AddGList();
  1798. Xvoid                    AddHead();
  1799. Xstruct Interrupt *            AddICRVector();
  1800. Xvoid                    AddIntServer();
  1801. Xvoid                    AddLibrary();
  1802. Xlong                    AddMemList();
  1803. Xvoid                    AddPort();
  1804. Xvoid                    AddResource();
  1805. Xvoid                    AddSemaphore();
  1806. Xvoid                    AddTail();
  1807. Xvoid                    AddTask();
  1808. Xvoid                    AddTime();
  1809. Xvoid                    AddVSprite();
  1810. Xlong                    Alert();
  1811. Xvoid *                    AllocAbs();
  1812. Xlong                    AllocBoardMem();
  1813. XcList                    AllocCList();
  1814. Xstruct ConfigDev *            AllocConfigDev();
  1815. Xstruct MemList *            AllocEntry();
  1816. Xunsigned long                AllocExpansionMem();
  1817. Xvoid *                    AllocMem();
  1818. Xlong                    AllocPotBits();
  1819. Xvoid *                    AllocRaster();
  1820. Xchar *                    AllocRemember();
  1821. Xlong                    AllocSignal();
  1822. Xlong                    AllocTrap();
  1823. Xstruct WBObject *            AllocWBObject();
  1824. Xvoid *                    Allocate();
  1825. Xvoid                    AlohaWorkbench();
  1826. Xvoid                    AndRectRegion();
  1827. Xlong                    AndRegionRegion();
  1828. Xvoid                    Animate();
  1829. Xshort                    AreaDraw();
  1830. Xlong                    AreaEllipse();
  1831. Xvoid                    AreaEnd();
  1832. Xshort                    AreaMove();
  1833. Xvoid                    AskFont();
  1834. Xlong                    AskSoftStyle();
  1835. Xlong                    AttemptLockLayerRom();
  1836. Xlong                    AttemptSemaphore();
  1837. Xshort                    AutoRequest();
  1838. Xlong                    AvailFonts();
  1839. Xlong                    AvailMem();
  1840. Xvoid                    BeginIO();
  1841. Xvoid                    BeginRefresh();
  1842. Xvoid                    BeginUpdate();
  1843. Xvoid                    BeginLayer();
  1844. Xlong                    BltBitMap();
  1845. Xlong                    BltBitMapRastPort();
  1846. Xvoid                    BltClear();
  1847. Xvoid                    BltMaskBitMapRastPort();
  1848. Xvoid                    BltPattern();
  1849. Xvoid                    BltTemplate();
  1850. Xstruct Window *                BuildSysRequest();
  1851. Xchar *                    BumpRevision();
  1852. Xvoid                    Cause();
  1853. Xvoid                    CBump();
  1854. Xstruct Events *                CDInputHandler();
  1855. Xvoid                    ChangeSprite();
  1856. Xstruct IORequest *            CheckIO();
  1857. Xshort                    ClearDMRequest();
  1858. Xvoid                    ClearEOL();
  1859. Xvoid                    ClearMenuStrip();
  1860. Xvoid                    ClearPointer();
  1861. Xvoid                    ClearRegion();
  1862. Xlong                    ClearRectRegion();
  1863. Xvoid                    ClearScreen();
  1864. Xvoid                    ClipBit();
  1865. Xvoid                    Close();
  1866. Xvoid                    CloseDevice();
  1867. Xvoid                    CloseFont();
  1868. Xvoid                    CloseLibrary();
  1869. Xvoid                    CloseScreen();
  1870. Xvoid                    CloseWindow();
  1871. Xshort                    CloseWorkBench();
  1872. Xvoid                    CMove();
  1873. Xshort                    CmpTime();
  1874. Xlong                    ConcatCList();
  1875. Xlong                    ConfigBoard();
  1876. Xlong                    ConfigChain();
  1877. Xlong                    ConsoleDevice();
  1878. Xlong                    CopperListInit();
  1879. XcList                    CopyCList();
  1880. Xvoid                    CopyMem();
  1881. Xvoid                    CopyMemQuick();
  1882. Xvoid                    CopySBitMap();
  1883. Xstruct Layer *                CreateBehindLayer();
  1884. XBPTR        CreateDir();
  1885. Xstruct MsgPort *            CreatePort();
  1886. Xstruct Process *            CreateProc();
  1887. Xstruct IOStdReq *            CreateStdIO();
  1888. Xstruct Task *                CreateTask();
  1889. Xstruct Layer *                CreateUpfrontLayer();
  1890. XBPTR                    CurrentDir();
  1891. Xvoid                    CurrentTime();
  1892. Xvoid                    CWait();
  1893. Xlong *                    DateStamp();
  1894. Xvoid                    Deallocate();
  1895. Xvoid                    Debug();
  1896. Xvoid                    Delay();
  1897. Xshort                    DeleteFile();
  1898. Xvoid                    DeleteLayer();
  1899. Xvoid                    DeletePort();
  1900. Xvoid                    DeleteStdIO();
  1901. Xvoid                    DeleteTask();
  1902. Xstruct Process *            DeviceProc();
  1903. Xvoid                    Disable();
  1904. Xvoid                    DisownBlitter();
  1905. Xshort                    DisplayAlert();
  1906. Xvoid                    DisplayBeep();
  1907. Xvoid                    DisposeRegion();
  1908. Xvoid                    DoCollision();
  1909. Xlong                    DoIO();
  1910. Xshort                    DoubleClick();
  1911. Xvoid                    Draw();
  1912. Xvoid                    DrawBorder();
  1913. Xvoid                    DrawEllipse();
  1914. Xvoid                    DrawGList();
  1915. Xvoid                    DrawImage();
  1916. XBPTR                    DupLock();
  1917. Xvoid                    Enable();
  1918. Xvoid                    EndRefresh();
  1919. Xvoid                    EndRequest();
  1920. Xvoid                    EndUpdate();
  1921. Xvoid                    Enqueue();
  1922. Xshort                    ExNext();
  1923. Xshort                    Examine();
  1924. Xshort                    Execute();
  1925. Xvoid                    Exit();
  1926. Xstruct ConfigDev *            FindConfigDev();
  1927. Xstruct Node *                FindName();
  1928. Xstruct MsgPort *            FindPort();
  1929. Xstruct Resident *            FindResident();
  1930. Xstruct SignalSemaphore *        FindSemaphore();
  1931. Xstruct Task *                FindTask();
  1932. Xchar *                    FindToolType();
  1933. Xshort                    Flood();
  1934. Xvoid                    FlushCList();
  1935. Xvoid                    Forbid();
  1936. Xvoid                    FreeBoardMem();
  1937. Xvoid                    FreeCList();
  1938. Xvoid                    FreeColorMap();
  1939. Xvoid                    FreeConfigDev();
  1940. Xvoid                    FreeCopList();
  1941. Xvoid                    FreeCprList();
  1942. Xvoid                    FreeDiskObject();
  1943. Xvoid                    FreeEntry();
  1944. Xvoid                    FreeExpansionMem();
  1945. Xvoid                    FreeFreeList();
  1946. Xvoid                    FreeGBuffers();
  1947. Xvoid                    FreeMem();
  1948. Xvoid                    FreePotBits();
  1949. Xvoid                    FreeRaster();
  1950. Xvoid                    FreeRemember();
  1951. Xvoid                    FreeSignal();
  1952. Xvoid                    FreeSprite();
  1953. Xvoid                    FreeSysRequest();
  1954. Xvoid                    FreeTrap();
  1955. Xvoid                    FreeVPortCopLists();
  1956. Xvoid                    FreeWBObject();
  1957. Xlong                    GetCC();
  1958. Xlong                    GetCLBuf();
  1959. Xshort                    GetCLChar();
  1960. Xshort                    GetCLWord();
  1961. Xstruct ColorMap *            GetColorMap();
  1962. Xlong                    GetCurrentBinding();
  1963. Xstruct Preferences *            GetDefPrefs();
  1964. Xstruct DiskObject *            GetDiskObject();
  1965. Xshort                    GetGBuffers();
  1966. Xlong                    GetIcon();
  1967. Xstruct Message *            GetMsg();
  1968. Xstruct Preferences *            GetPrefs();
  1969. Xshort                    GetRGB4();
  1970. Xlong                    GetScreenData();
  1971. Xshort                    GetSprite();
  1972. Xstruct WBObject *            GetWBObject();
  1973. Xlong                    IncrCLMark();
  1974. Xshort                    Info();
  1975. Xvoid                    InitArea();
  1976. Xvoid                    InitBitMap();
  1977. Xlong                    InitCLPool();
  1978. Xvoid                    InitCode();
  1979. Xvoid                    InitGMasks();
  1980. Xvoid                    InitGels();
  1981. Xvoid                    InitMasks();
  1982. Xvoid                    InitRastPort();
  1983. Xvoid                    InitRequester();
  1984. Xvoid                    InitResident();
  1985. Xvoid                    InitSemaphore();
  1986. Xvoid                    InitStruct();
  1987. Xvoid                    InitTmpRas();
  1988. Xvoid                    InitVPort();
  1989. Xvoid                    InitView();
  1990. XBPTR                    Input();
  1991. Xvoid                    Insert();
  1992. Xstruct Region *                InstallClipRegion();
  1993. Xlong                    IntuiTextLength();
  1994. Xstruct InputEvent *            Intuition();
  1995. Xlong                    IoErr();
  1996. Xshort                    IsInteractive();
  1997. Xstruct MenuItem *            ItemAddress();
  1998. Xvoid                    LoadRGB4();
  1999. Xstruct Segment *            LoadSeg();
  2000. Xvoid                    LoadView();
  2001. XBPTR                    Lock();
  2002. Xvoid                    LockLayer();
  2003. Xvoid                    LockLayerInfo();
  2004. Xvoid                    LockLayerRom();
  2005. Xvoid                    LockLayers();
  2006. Xstruct DeviceNode *            MakeDosNode();
  2007. Xlong                    MakeFunctions();
  2008. Xstruct Library *            MakeLibrary();
  2009. Xvoid                    MakeScreen();
  2010. Xvoid                    MakeVPort();
  2011. Xlong                    MarkCList();
  2012. Xlong                    MatchToolValue();
  2013. Xvoid                    ModifyIDCMP();
  2014. Xvoid                    ModifyProp();
  2015. Xvoid                    Move();
  2016. Xlong                    MoveLayer();
  2017. Xvoid                    MoveScreen();
  2018. Xvoid                    MoveSprite();
  2019. Xvoid                    MoveWindow();
  2020. Xvoid                    MrgCop();
  2021. Xvoid                    NewList();
  2022. Xvoid                    NewModifyProp();
  2023. Xstruct Region *                NewRegion();
  2024. Xvoid                    ObtainConfigBinding();
  2025. Xvoid                    ObtainSemaphore();
  2026. Xvoid                    ObtainSemaphoreList();
  2027. Xvoid                    OffGadget();
  2028. Xvoid                    OffMenu();
  2029. Xvoid                    OnGadget();
  2030. Xvoid                    OnMenu();
  2031. XBPTR                    Open();
  2032. Xlong                    OpenDevice();
  2033. Xstruct Font *                OpenDiskFont();
  2034. Xstruct Font *                OpenFont();
  2035. Xvoid                    OpenIntuition();
  2036. Xstruct Library *            OpenLibrary();
  2037. Xstruct MiscResource *            OpenResource();
  2038. Xstruct Screen *                OpenScreen();
  2039. Xstruct Window *                OpenWindow();
  2040. Xshort                    OpenWorkBench();
  2041. Xvoid                    OrRectRegion();
  2042. Xlong                    OrRegionRegion();
  2043. XBPTR                    Output();
  2044. Xvoid                    OwnBlitter();
  2045. XBPTR                    ParentDir();
  2046. Xshort                    PeekCLMark();
  2047. Xvoid                    Permit();
  2048. Xvoid                    PolyDraw();
  2049. Xvoid                    PrintIText();
  2050. Xlong                    PutCLBuf();
  2051. Xlong                    PutCLChar();
  2052. Xlong                    PutCLWord();
  2053. Xshort                    PutDiskObject();
  2054. Xlong                    PutIcon();
  2055. Xvoid                    PutMsg();
  2056. Xlong                    PutWBObject();
  2057. Xvoid                    QBSBlit();
  2058. Xvoid                    QBlit();
  2059. Xshort                    RawKeyConvert();
  2060. Xlong                    Read();
  2061. Xchar                    ReadExpansionByte();
  2062. Xlong                    ReadExpansionRom();
  2063. Xshort                    ReadPixel();
  2064. Xvoid                    RectFill();
  2065. Xvoid                    RefreshGadgets();
  2066. Xvoid                    RefreshGList();
  2067. Xvoid                    RefreshWindowFrame();
  2068. Xvoid                    ReleaseConfigBinding();
  2069. Xvoid                    ReleaseSemaphore();
  2070. Xvoid                    ReleaseSemaphoreList();
  2071. Xvoid                    RemConfigDev();
  2072. Xlong                    RemDevice();
  2073. Xvoid                    RemFont();
  2074. Xstruct Node *                RemHead();
  2075. Xvoid                    RemIBob();
  2076. Xvoid                    RemICRVector();
  2077. Xvoid                    RemIntServer();
  2078. Xlong                    RemLibrary();
  2079. Xunsigned short                RemoveGList();
  2080. Xvoid                    RemPort();
  2081. Xvoid                    RemResource();
  2082. Xvoid                    RemSemaphore();
  2083. Xstruct Node *                RemTail();
  2084. Xvoid                    RemTask();
  2085. Xvoid                    RemVSprite();
  2086. Xvoid                    RemakeDisplay();
  2087. Xvoid                    Remove();
  2088. Xunsigned short                RemoveGadget();
  2089. Xshort                    Rename();
  2090. Xvoid                    ReplyMsg();
  2091. Xvoid                    ReportMouse();
  2092. Xshort                    Request();
  2093. Xvoid                    RethinkDisplay();
  2094. Xvoid                    ScreenToBack();
  2095. Xvoid                    ScreenToFront();
  2096. Xvoid                    ScrollLayer();
  2097. Xvoid                    ScrollRaster();
  2098. Xvoid                    ScrollVPort();
  2099. Xlong                    Seek();
  2100. Xvoid                    SendIO();
  2101. Xvoid                    SetAPen();
  2102. Xvoid                    SetBPen();
  2103. Xvoid                    SetCollision();
  2104. Xshort                    SetComment();
  2105. Xvoid                    SetCurrentBinding();
  2106. Xshort                    SetDMRequest();
  2107. Xvoid                    SetDRMd();
  2108. Xlong                    SetExcept();
  2109. Xlong                    SetFont();
  2110. Xlong                    SetFunction();
  2111. Xlong                    SetICR();
  2112. Xstruct Interrupt *            SetIntVector();
  2113. Xshort                    SetMenuStrip();
  2114. Xvoid                    SetPointer();
  2115. Xstruct Preferences *            SetPrefs();
  2116. Xshort                    SetProtection();
  2117. Xvoid                    SetRast();
  2118. Xvoid                    SetRGB4();
  2119. Xvoid                    SetRGB4CM();
  2120. Xlong                    SetSR();
  2121. Xlong                    SetSignal();
  2122. Xlong                    SetSoftStyle();
  2123. Xshort                    SetTaskPri();
  2124. Xvoid                    SetWindowTitles();
  2125. Xvoid                    ShowTitle();
  2126. Xvoid                    Signal();
  2127. Xlong                    SizeCList();
  2128. Xshort                    SizeLayer();
  2129. Xvoid                    SizeWindow();
  2130. Xvoid                    SortGList();
  2131. XcList                    SplitCList();
  2132. XcList                    SubCList();
  2133. Xvoid                    SubTime();
  2134. Xvoid                    SubLibrary();
  2135. Xvoid                    SumKickData();
  2136. Xlong                    SuperState();
  2137. Xvoid                    SwapBitsRastPortClipRect();
  2138. Xvoid                    SyncSBitMap();
  2139. Xlong                    Text();
  2140. Xlong                    TextLength();
  2141. Xlong                    Translate();
  2142. Xlong                    UnGetCLChar();
  2143. Xlong                    UnGetCLWord();
  2144. Xvoid                    UnLoadSeg();
  2145. Xvoid                    UnLock();
  2146. Xshort                    UnPutCLChar();
  2147. Xshort                    UnPutCLWord();
  2148. Xvoid                    UnlockLayer();
  2149. Xvoid                    UnlockLayerInfo();
  2150. Xvoid                    UnlockLayerRom();
  2151. Xvoid                    UnlockLayers();
  2152. Xshort                    UpfrontLayer();
  2153. Xvoid                    UserState();
  2154. Xshort                    VBeamPos();
  2155. Xstruct View *                ViewAddress();
  2156. Xstruct ViewPort *            ViewPortAddress();
  2157. Xshort                    WBenchToBack();
  2158. Xshort                    WBenchToFront();
  2159. Xlong                    Wait();
  2160. Xvoid                    WaitBOVP();
  2161. Xvoid                    WaitBlit();
  2162. Xshort                    WaitForChar();
  2163. Xlong                    WaitIO();
  2164. Xstruct Message *            WaitPort();
  2165. Xvoid                    WaitTOF();
  2166. Xstruct Layer *                WhichLayer();
  2167. Xshort                    WindowLimits();
  2168. Xvoid                    WindowToBack();
  2169. Xvoid                    WindowToFront();
  2170. Xlong                    Write();
  2171. Xlong                    WriteExpansionByte();
  2172. Xvoid                    WritePixel();
  2173. Xvoid                    WritePotgo();
  2174. Xvoid                    XorRectRegion();
  2175. Xlong                    XorRegionRegion();
  2176. END_OF_FILE
  2177. if test 9694 -ne `wc -c <'src/shellfunctions.h'`; then
  2178.     echo shar: \"'src/shellfunctions.h'\" unpacked with wrong size!
  2179. fi
  2180. # end of 'src/shellfunctions.h'
  2181. fi
  2182. if test -f 'src/sub.c' -a "${1}" != "-c" ; then 
  2183.   echo shar: Will not clobber existing file \"'src/sub.c'\"
  2184. else
  2185. echo shar: Extracting \"'src/sub.c'\" \(13352 characters\)
  2186. sed "s/^X//" >'src/sub.c' <<'END_OF_FILE'
  2187. X
  2188. X/*
  2189. X * SUB.C
  2190. X *
  2191. X * (c)1986 Matthew Dillon     9 October 1986
  2192. X *
  2193. X * Version 2.07M by Steve Drew 10-Sep-87
  2194. X *
  2195. X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
  2196. X *
  2197. X */
  2198. X
  2199. X#define HM_STR 0              /* various HISTORY retrieval modes */
  2200. X#define HM_REL 1
  2201. X#define HM_ABS 2
  2202. X
  2203. Xseterr()
  2204. X{
  2205. Xchar buf[32];
  2206. Xint stat;
  2207. X
  2208. Xsprintf(buf, "%d", Lastresult);
  2209. Xset_var(LEVEL_SET, v_lasterr, buf);
  2210. Xstat = atoi(get_var(LEVEL_SET, v_stat));
  2211. Xif (stat < Lastresult) set_var(LEVEL_SET, v_stat, buf);
  2212. X}
  2213. X
  2214. X#define ISSPACE(c) ((c)==' ' || (c)==9 || (unsigned char)(c)==0xA0)
  2215. X
  2216. Xchar *next_word(str)
  2217. Xregister char *str;
  2218. X{
  2219. Xwhile (*str && ! ISSPACE(*str)) ++str;
  2220. Xwhile (*str &&   ISSPACE(*str)) ++str;
  2221. Xreturn str;
  2222. X}
  2223. X
  2224. Xhasspace(s)
  2225. Xregister char *s;
  2226. X{
  2227. Xfor ( ; *s; s++)
  2228. X    if (ISSPACE(*s)) return 1;
  2229. Xreturn 0;
  2230. X}
  2231. X
  2232. Xchar *compile_av(av, start, end, delim, quote)
  2233. Xchar **av;
  2234. Xunsigned char delim;
  2235. X{
  2236. Xregister char *cstr, *p;
  2237. Xint len;
  2238. Xregister unsigned int i;
  2239. X
  2240. Xlen = 1;
  2241. Xfor (i = start; i < end; ++i) len += strlen(av[i]) + 3;
  2242. Xp = cstr = malloc(len);
  2243. X*cstr = '\0';
  2244. Xfor (i = start; i < end; ++i) {
  2245. X    if (debug) fprintf (stderr, "AV[%2d] :%s:\n", i, av[i]);
  2246. X    if (quote && hasspace(av[i]))
  2247. X        p += sprintf(p, "\"%s\"", av[i]);
  2248. X    else
  2249. X        p += sprintf(p, "%s",     av[i]);
  2250. X    if (i+1 < end) *p++=delim;
  2251. X    }
  2252. X*p='\0';
  2253. Xreturn cstr;
  2254. X}
  2255. X
  2256. X/*
  2257. X * FREE(ptr)   --frees without actually freeing, so the data is still good
  2258. X *               immediately after the free.
  2259. X */
  2260. X
  2261. X
  2262. XFree(ptr)
  2263. Xchar *ptr;
  2264. X{
  2265. Xstatic char *old_ptr;
  2266. X
  2267. Xif (old_ptr) free (old_ptr);
  2268. Xold_ptr = ptr;
  2269. X}
  2270. X
  2271. X/*
  2272. X * Add new string to history (H_head, H_tail, H_len,
  2273. X *  S_histlen
  2274. X */
  2275. X
  2276. Xadd_history(str)
  2277. Xchar *str;
  2278. X{
  2279. X   register struct HIST *hist;
  2280. X
  2281. X   if (H_head != NULL && strcmp(H_head->line, str) == 0)
  2282. X       return(0);
  2283. X   while (H_len > S_histlen)
  2284. X      del_history();
  2285. X   hist = (struct HIST *)malloc (sizeof(struct HIST));
  2286. X   if (H_head == NULL) {
  2287. X      H_head = H_tail = hist;
  2288. X      hist->next = NULL;
  2289. X   } else {
  2290. X      hist->next = H_head;
  2291. X      H_head->prev = hist;
  2292. X      H_head = hist;
  2293. X   }
  2294. X   hist->prev = NULL;
  2295. X   hist->line = malloc (strlen(str) + 1);
  2296. X   strcpy (hist->line, str);
  2297. X   ++H_len;
  2298. X}
  2299. X
  2300. Xdel_history()
  2301. X{
  2302. X   if (H_tail) {
  2303. X      --H_len;
  2304. X      ++H_tail_base;
  2305. X      free (H_tail->line);
  2306. X      if (H_tail->prev) {
  2307. X         H_tail = H_tail->prev;
  2308. X         free (H_tail->next);
  2309. X         H_tail->next = NULL;
  2310. X      } else {
  2311. X         free (H_tail);
  2312. X         H_tail = H_head = NULL;
  2313. X      }
  2314. X   }
  2315. X}
  2316. X
  2317. Xchar *
  2318. Xget_history(ptr)
  2319. Xchar *ptr;
  2320. X{
  2321. X   register struct HIST *hist;
  2322. X   register int len;
  2323. X   int mode = HM_REL;
  2324. X   int num  = 1;
  2325. X   char *str;
  2326. X   char *result = NULL;
  2327. X
  2328. X   if (ptr[1] >= '0' && ptr[1] <= '9') {
  2329. X      mode = HM_ABS;
  2330. X      num  = atoi(&ptr[1]);
  2331. X      goto skip;
  2332. X   }
  2333. X   switch (ptr[1]) {
  2334. X   case '!':
  2335. X      break;
  2336. X   case '-':
  2337. X      num += atoi(&ptr[2]);
  2338. X      break;
  2339. X   default:
  2340. X      mode = HM_STR;
  2341. X      str  = ptr + 1;
  2342. X      break;
  2343. X   }
  2344. Xskip:
  2345. X   switch (mode) {
  2346. X   case HM_STR:
  2347. X      len = strlen(str);
  2348. X      for (hist = H_head; hist; hist = hist->next) {
  2349. X         if (strncmp(hist->line, str, len) == 0 && *hist->line != '!') {
  2350. X            result = hist->line;
  2351. X            break;
  2352. X         }
  2353. X      }
  2354. X      break;
  2355. X   case HM_REL:
  2356. X      for (hist = H_head; hist && num--; hist = hist->next);
  2357. X      if (hist)
  2358. X         result = hist->line;
  2359. X      break;
  2360. X   case HM_ABS:
  2361. X      len = H_tail_base;
  2362. X      for (hist = H_tail; hist && len != num; hist = hist->prev, ++len);
  2363. X      if (hist)
  2364. X         result = hist->line;
  2365. X      break;
  2366. X   }
  2367. X   if (result) {
  2368. X      fprintf(stderr,"%s\n",result);
  2369. X      return(result);
  2370. X   }
  2371. X   printf("History failed\n");
  2372. X   return ("");
  2373. X}
  2374. X
  2375. Xreplace_head(str)
  2376. Xchar *str;
  2377. X{
  2378. X   if (str == NULL)
  2379. X      str = "";
  2380. X   if (H_head) {
  2381. X      free (H_head->line);
  2382. X      H_head->line = malloc (strlen(str)+1);
  2383. X      strcpy (H_head->line, str);
  2384. X   }
  2385. X}
  2386. X
  2387. X
  2388. XpError(str)
  2389. Xchar *str;
  2390. X{
  2391. Xint ierr = (long)IoErr();
  2392. Xierror(str, ierr);
  2393. X}
  2394. X
  2395. Xierror(str, err)
  2396. Xregister char *str;
  2397. X{
  2398. X   register struct PERROR *per = Perror;
  2399. X
  2400. X   if (err) {
  2401. X      for (; per->errstr; ++per) {
  2402. X         if (per->errnum == err) {
  2403. X            fprintf (stderr, "%s%s%s\n",
  2404. X                  per->errstr,
  2405. X                  (str) ? ": " : "",
  2406. X                  (str) ? str : "");
  2407. X            return ((short)err);
  2408. X         }
  2409. X      }
  2410. X      fprintf (stderr, "Unknown DOS error %d %s\n", err, (str) ? str : "");
  2411. X   }
  2412. X   return ((short)err);
  2413. X}
  2414. X
  2415. X/*
  2416. X * Disk directory routines
  2417. X *
  2418. X * dptr = dopen(name, stat)
  2419. X *    struct DPTR *dptr;
  2420. X *    char *name;
  2421. X *    int *stat;
  2422. X *
  2423. X * dnext(dptr, name, stat)
  2424. X *    struct DPTR *dptr;
  2425. X *    char **name;
  2426. X *    int  *stat;
  2427. X *
  2428. X * dclose(dptr)                  -may be called with NULL without harm
  2429. X *
  2430. X * dopen() returns a struct DPTR, or NULL if the given file does not
  2431. X * exist.  stat will be set to 1 if the file is a directory.  If the
  2432. X * name is "", then the current directory is openned.
  2433. X *
  2434. X * dnext() returns 1 until there are no more entries.  The **name and
  2435. X * *stat are set.  *stat = 1 if the file is a directory.
  2436. X *
  2437. X * dclose() closes a directory channel.
  2438. X *
  2439. X */
  2440. X
  2441. Xstruct DPTR *
  2442. Xdopen(name, stat)
  2443. Xchar *name;
  2444. Xint *stat;
  2445. X{
  2446. Xstruct DPTR *dp;
  2447. X
  2448. X*stat = 0;
  2449. Xdp = (struct DPTR *)malloc(sizeof(struct DPTR));
  2450. Xif (*name == '\0')
  2451. X    dp->lock = DupLock(Myprocess->pr_CurrentDir);
  2452. Xelse
  2453. X    dp->lock = Lock (name,ACCESS_READ);
  2454. Xif (dp->lock == NULL) {
  2455. X    free (dp);
  2456. X    return NULL;
  2457. X    }
  2458. Xdp->fib = (FIB *)AllocMem((long)sizeof(FIB), MEMF_PUBLIC);
  2459. Xif (!Examine (dp->lock, dp->fib)) {
  2460. X    pError (name);
  2461. X    dclose (dp);
  2462. X    return NULL;
  2463. X    }
  2464. Xif (dp->fib->fib_DirEntryType >= 0) *stat = 1;
  2465. Xreturn dp;
  2466. X}
  2467. X
  2468. Xdnext(dp, pname, stat)
  2469. Xstruct DPTR *dp;
  2470. Xchar **pname;
  2471. Xint *stat;
  2472. X{
  2473. Xif (dp == NULL) return (0);
  2474. X   if (ExNext (dp->lock, dp->fib)) {
  2475. X      *stat = (dp->fib->fib_DirEntryType < 0) ? 0 : 1;
  2476. X      *pname = dp->fib->fib_FileName;
  2477. X      return (1);
  2478. X   }
  2479. X   return (0);
  2480. X}
  2481. X
  2482. X
  2483. Xdclose(dp)
  2484. Xstruct DPTR *dp;
  2485. X{
  2486. X   if (dp == NULL)
  2487. X      return (1);
  2488. X   if (dp->fib)
  2489. X      FreeMem (dp->fib,(long)sizeof(*dp->fib));
  2490. X   if (dp->lock)
  2491. X      UnLock (dp->lock);
  2492. X   free (dp);
  2493. X   return (1);
  2494. X}
  2495. X
  2496. X
  2497. Xisdir(file)
  2498. Xchar *file;
  2499. X{
  2500. X   register struct DPTR *dp;
  2501. X   int stat;
  2502. X
  2503. X   stat = 0;
  2504. X   if (dp = dopen (file, &stat))
  2505. X      dclose(dp);
  2506. X   return (stat == 1);
  2507. X}
  2508. X
  2509. X
  2510. Xfree_expand(av)
  2511. Xregister char **av;
  2512. X{
  2513. X   char **base = av;
  2514. X
  2515. X   if (av) {
  2516. X      while (*av) {
  2517. X         free (*av);
  2518. X         ++av;
  2519. X      }
  2520. X      free (base);
  2521. X   }
  2522. X}
  2523. X
  2524. X/*
  2525. X * EXPAND(base,pac)
  2526. X *    base           - char * (example: "df0:*.c")
  2527. X *    pac            - int  *  will be set to # of arguments.
  2528. X *
  2529. X * 22-May-87 SJD.  Heavily modified to allow recursive wild carding and
  2530. X *                 simple directory/file lookups. Returns a pointer to
  2531. X *                 an array of pointers that contains the full file spec
  2532. X *                 eg. 'df0:c/sear*' would result in : 'df0:C/Search'
  2533. X *
  2534. X *                 Now no longer necessary to Examine the files a second time
  2535. X *                 in do_dir since expand will return the full file info
  2536. X *                 appended to the file name. Set by formatfile().
  2537. X *                 eg. fullfilename'\0'rwed  NNNNNN NNNN  DD-MMM-YY HH:MM:SS
  2538. X *
  2539. X *                 Caller must call free_expand when done with the array.
  2540. X *
  2541. X * base             bname =       ename =
  2542. X * ------           -------       -------
  2543. X *  "*"               ""            "*"
  2544. X *  "!*.info"         ""            "*.info" (wild_exclude set)
  2545. X *  "su*d/*"          ""            "*"      (tail set)
  2546. X *  "file.*"          ""            "file.*"
  2547. X *  "df0:c/*"         "df0:c"       "*"
  2548. X *  ""                ""            "*"
  2549. X *  "df0:.../*"       "df0:"        "*"      (recur set)
  2550. X *  "df0:sub/.../*"   "df0:sub"     "*"      (recur set)
  2551. X *
  2552. X * ---the above base would be provided by execom.c or do_dir().
  2553. X * ---the below base would only be called from do_dir().
  2554. X *
  2555. X *  "file.c"          "file.c"      ""       if (dp == 0) fail else get file.c
  2556. X *  "df0:"            "df0:"        "*"
  2557. X *  "file/file"       "file/file"   ""       (dp == 0) so fail
  2558. X *  "df0:.../"        "df0:"        "*"      (recur set)
  2559. X *
  2560. X */
  2561. X
  2562. X
  2563. Xchar **
  2564. Xexpand(base, pac)
  2565. Xchar *base;
  2566. Xint *pac;
  2567. X{
  2568. X   register char *ptr;
  2569. X   char **eav = (char **)malloc(sizeof(char *) * (2));
  2570. X   short eleft, eac;
  2571. X   char *name;
  2572. X   char *svfile();
  2573. X   char *bname, *ename, *tail;
  2574. X   int stat, recur, scr, bl;
  2575. X   register struct DPTR *dp;
  2576. X
  2577. X   *pac = recur = eleft = eac = 0;
  2578. X
  2579. X   base = strcpy(malloc(strlen(base)+1), base);
  2580. X   for (ptr = base; *ptr && *ptr != '?' && *ptr != '*'; ++ptr);
  2581. X
  2582. X   if (!*ptr)   /* no wild cards */
  2583. X      --ptr;
  2584. X   else
  2585. X      for (; ptr >= base && !(*ptr == '/' || *ptr == ':'); --ptr);
  2586. X
  2587. X   if (ptr < base) {
  2588. X      bname = strcpy (malloc(1), "");
  2589. X   } else {
  2590. X      scr = ptr[1];
  2591. X      ptr[1] = '\0';
  2592. X      if (!strcmp(ptr-3,".../")) {
  2593. X         recur = 1;
  2594. X         *(ptr-3) = '\0';
  2595. X      }
  2596. X      bname = strcpy (malloc(strlen(base)+2), base);
  2597. X      ptr[1] = scr;
  2598. X   }
  2599. X   bl = strlen(bname);
  2600. X   ename = ++ptr;
  2601. X   for (; *ptr && *ptr != '/'; ++ptr);
  2602. X   scr = *ptr;
  2603. X   *ptr = '\0';
  2604. X   if (scr) ++ptr;
  2605. X   tail = ptr;
  2606. X
  2607. X   if ((dp = dopen (bname, &stat)) == NULL || (stat == 0 && *ename)) {
  2608. X      free (bname);
  2609. X      free (base);
  2610. X      free (eav);
  2611. X      return (NULL);
  2612. X   }
  2613. X
  2614. X   if (!stat) {                /* eg. 'dir file' */
  2615. X      char *p,*s;
  2616. X      for(s = p = bname; *p; ++p) if (*p == '/' || *p == ':') s = p;
  2617. X      if (s != bname) ++s;
  2618. X      *s ='\0';
  2619. X      eav[eac++] = svfile(bname,dp->fib->fib_FileName,dp->fib);
  2620. X      goto done;
  2621. X   }
  2622. X   if (!*ename) ename = "*";    /* eg. dir df0: */
  2623. X   if (*bname && bname[bl-1] != ':' && bname[bl-1] != '/') { /* dir df0:c */
  2624. X      bname[bl] = '/';
  2625. X      bname[++bl] = '\0';
  2626. X   }
  2627. X   while ((dnext (dp, &name, &stat)) && !breakcheck()) {
  2628. X        int match = compare_ok(ename,name,0);
  2629. X      if (match && !(!recur && *tail)) {
  2630. X         if (eleft < 2) {
  2631. X               char **scrav = (char **)malloc(sizeof(char *) * (eac + 10));
  2632. X               movmem (eav, scrav, (eac + 1) << 2);
  2633. X               free (eav);
  2634. X               eav = scrav;
  2635. X               eleft = 10;
  2636. X         }
  2637. X         eav[eac++] = svfile(bname,name,dp->fib);
  2638. X         --eleft;
  2639. X      }
  2640. X      if ((*tail && match) || recur) {
  2641. X         int alt_ac;
  2642. X         char *search, **alt_av, **scrav;
  2643. X         BPTR lock;
  2644. X
  2645. X         if (!stat)           /* expect more dirs, but this not a dir */
  2646. X            continue;
  2647. X         lock = CurrentDir (dp->lock);
  2648. X         search = malloc(strlen(ename)+strlen(name)+strlen(tail)+5);
  2649. X         strcpy (search, name);
  2650. X         strcat (search, "/");
  2651. X         if (recur) {
  2652. X            strcat(search, ".../");
  2653. X            strcat(search, ename);
  2654. X         }
  2655. X         strcat (search, tail);
  2656. X         scrav = alt_av = expand (search, &alt_ac);
  2657. X         /* free(search); */
  2658. X         CurrentDir (lock);
  2659. X         if (scrav) {
  2660. X            while (*scrav) {
  2661. X               int l;
  2662. X               if (eleft < 2) {
  2663. X                  char **scrav = (char **)malloc(sizeof(char *) * (eac + 10));
  2664. X                  movmem (eav, scrav, (eac + 1) << 2);
  2665. X                  free (eav);
  2666. X                  eav = scrav;
  2667. X                  eleft = 10;
  2668. X               }
  2669. X
  2670. X               l = strlen(*scrav);
  2671. X               scrav[0][l] = ' ';
  2672. X               eav[eac] = malloc(bl+l+45);
  2673. X               strcpy(eav[eac], bname);
  2674. X               strcat(eav[eac], *scrav);
  2675. X               eav[eac][l+bl] = '\0';
  2676. X
  2677. X               free (*scrav);
  2678. X               ++scrav;
  2679. X               --eleft, ++eac;
  2680. X            }
  2681. X            free (alt_av);
  2682. X         }
  2683. X      }
  2684. X   }
  2685. Xdone:
  2686. X   dclose (dp);
  2687. X   *pac = eac;
  2688. X   eav[eac] = NULL;
  2689. X   free (bname);
  2690. X   free (base);
  2691. X   if (eac) {
  2692. X      return (eav);
  2693. X   }
  2694. X   free (eav);
  2695. X   return (NULL);
  2696. X}
  2697. X
  2698. Xchar *strupr(s)
  2699. Xregister char *s;
  2700. X{
  2701. Xwhile (*s) *s=toupper(*s), s++;
  2702. Xreturn s;
  2703. X}
  2704. X
  2705. Xchar *strlwr(s)
  2706. Xregister char *s;
  2707. X{
  2708. Xwhile (*s) *s=tolower(*s), s++;
  2709. Xreturn s;
  2710. X}
  2711. X
  2712. X/*
  2713. X * Compare a wild card name with a normal name
  2714. X */
  2715. X
  2716. Xcompare_ok(wild, name, casedep)
  2717. Xchar *wild, *name;
  2718. X{
  2719. Xint queryflag;
  2720. Xchar buf[260], wildbuf[260], *lowname;
  2721. X
  2722. Xif (queryflag=(*wild=='&')) wild++;
  2723. Xif (*wild=='!') *wild='~';
  2724. X
  2725. Xif (! casedep) {
  2726. X    strupr(wild);
  2727. X    strcpy(buf,name);
  2728. X    strupr(buf);
  2729. X    lowname=buf;
  2730. X    }
  2731. Xelse lowname=name;
  2732. X
  2733. XPreParse(wild, wildbuf);
  2734. Xif ( ! PatternMatch(wildbuf,lowname)) return 0;
  2735. X
  2736. Xif (queryflag) {
  2737. X    printf("Select \23337m%-16s\2330m [y/n] ? ",name);
  2738. X    gets(buf);
  2739. X    return (toupper(*buf)=='Y');
  2740. X    }
  2741. Xreturn 1;
  2742. X}
  2743. X
  2744. Xchar *svfile(s1,s2,fib)
  2745. Xchar *s1,*s2;
  2746. XFIB *fib;
  2747. X{
  2748. Xchar *p = malloc (strlen(s1)+strlen(s2)+45);
  2749. Xstrcpy(p, s1);
  2750. Xstrcat(p, s2);
  2751. Xformatfile(p,fib);
  2752. Xreturn p;
  2753. X}
  2754. X
  2755. X/* will have either of these formats:
  2756. X *
  2757. X *    fullfilename'\0'hsparwed   <Dir>       DD-MMM-YY HH:MM:SS\n'\0'
  2758. X *    fullfilename'\0'hsparwed  NNNNNN NNNN  DD-MMM-YY HH:MM:SS\n'\0'
  2759. X *                              1111111111222222222233333333334 4  4
  2760. X *                    01234567890123456789012345678901234567890 1  2
  2761. X */
  2762. Xformatfile(str,fib)
  2763. Xchar *str;
  2764. XFIB *fib;
  2765. X{
  2766. Xchar *dates();
  2767. Xint i;
  2768. Xwhile(*str++);
  2769. Xfor (i=7; i>=0; i--)
  2770. X    *str++ = ((fib->fib_Protection & (1L<<i)) ? "hspa----" : "----rwed")[7-i];
  2771. Xif (fib->fib_DirEntryType < 0)
  2772. X  sprintf(str,"  %6ld %4ld  ", (long)fib->fib_Size, (long)fib->fib_NumBlocks);
  2773. Xelse strcpy(str,"   <Dir>       ");
  2774. Xstrcat(str,dates(&fib->fib_Date));
  2775. X}
  2776. X
  2777. X/* Sort routines */
  2778. X
  2779. Xlong cmp(s1, s2)
  2780. Xchar **s1, **s2;
  2781. X{
  2782. Xreturn (long)Strcmp(*s1, *s2);
  2783. X}
  2784. X
  2785. XCmp() {
  2786. X#asm
  2787. X    public    _geta4
  2788. X    movem.l    d2-d3/a4/a6,-(sp)
  2789. X    movem.l    a0/a1,-(sp)
  2790. X    bsr    _geta4
  2791. X    bsr    _cmp
  2792. X    addq.l    #8,sp
  2793. X    movem.l    (sp)+,d2-d3/a4/a6
  2794. X#endasm
  2795. X}
  2796. X
  2797. XQuickSort(av, n)
  2798. Xchar *av[];
  2799. Xint n;
  2800. X{
  2801. XQSort(av, (long)n, 4L, Cmp);
  2802. X}
  2803. END_OF_FILE
  2804. if test 13352 -ne `wc -c <'src/sub.c'`; then
  2805.     echo shar: \"'src/sub.c'\" unpacked with wrong size!
  2806. fi
  2807. # end of 'src/sub.c'
  2808. fi
  2809. echo shar: End of archive 1 \(of 3\).
  2810. cp /dev/null ark1isdone
  2811. MISSING=""
  2812. for I in 1 2 3 ; do
  2813.     if test ! -f ark${I}isdone ; then
  2814.     MISSING="${MISSING} ${I}"
  2815.     fi
  2816. done
  2817. if test "${MISSING}" = "" ; then
  2818.     echo You have unpacked all 3 archives.
  2819.     rm -f ark[1-9]isdone
  2820. else
  2821.     echo You still need to unpack the following archives:
  2822.     echo "        " ${MISSING}
  2823. fi
  2824. ##  End of shell archive.
  2825. exit 0
  2826. -- 
  2827. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  2828. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  2829. Post requests for sources, and general discussion to comp.sys.amiga.misc.
  2830.